2015-02-24 8 views
0
* Description : This program allows a user to enter a password and and the name of a text file. After the user 
* has entered sufficient information, the program will encode the text and save the overwrite the file with the 
* encoded message. 
* 
*/ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char make_lower (char ch){//This converts the text of the selected file to all be lowered 
int i;//initializing 

    if (isalpha(ch)==1) ch=tolower(ch);//if the selected item in the file is an uppercase character, then it converts it to lowercase. 
    else;//other-wise do nothing 
    return ch; 
} 

void randomize (char arr[], int n, int pswd)//Function that randomizes the alphabet to use while encoding 
{ 
    int i;//initialing 
    char ch;//initializing 
    // Use a different seed value so that we don't get same 
    // result each time we run this program 
    srand (pswd);//using the seed the user has entered 

    // Start from the last element and swap one by one. We don't 
    // need to run for the first element that's why i > 0 
    for (i = 0; i < 26; ++i)//for loop the iterates through the alphabet array 
    { 
     // Pick a random index from 0 to 25 
     int random = rand()%26; 

     // Swap arr[i] with the element at random index 
     char tmp = arr[random];//swapping 
     arr[random] = arr[i];//swapping 
     arr[i] = tmp;//swapping 
    }} 

char encode (char ch, char alpha[]){//function that encodes a message using the alphabet that was randomized 
int i, tmp;//initializing 

    if (isalpha(ch)== 2){//if the selected character is a lowercase then it gets swapped with the "encoded" character. 
    int k = ch; 
    ch = alpha[k-97]; 
} 
return ch;} 


int main(int argc,char *argv[]) { 

    char alpha[26] = ("abcdefghijklmnopqrstuvwxyz");//initializing char array 
    randomize(alpha, 26, argc); 
    int i=0; 
    char ch; 
    while (argv[i] != EOF){ 
    ch = argv[i]; 
    ch = make_lower(ch); 
    ch = encode(ch,alpha); 
    putchar(ch); 
++i; 
    } 
} 

Я не знаю, почему я продолжаю получать ошибку: ошибка сегментации (сбрасывание ядра). Я считаю, что у меня есть указатель на изгоев, но я не знаю, как это исправить. Я использовал отладчик и все еще не могу исправить проблему.Почему у меня ошибка сегментации?

Может кто-нибудь помочь? Спасибо!

+0

'ch = argv [i];' является ошибкой. Вы должны получить сообщения компилятора об этом; обратите внимание на них! Я * думаю *, что вы на самом деле пытаетесь сделать, это петля над одной введенной строкой (вместо того, чтобы перебирать все строки), вы, вероятно, имели в виду 'while (argv [1] [i]! = '\ 0') {ch = argv [1] [i]; 'и т. д. –

+0

Ваш код не имеет большого сходства с описанием. Вы не используете пароль, введенный пользователем (вместо этого вы используете 'argc', который является подсчетом количества аргументов).Вы не пытаетесь открыть файл или прочитать данные, которые должны быть закодированы, и в описании рандомизации ничего не упоминается. –

ответ

2

ваш альфа-массив состоит из 27 элементов: 26 (каждый буквы) + '\ 0' (конец строки терминатор)

char alpha[27] = "abcdefghijklmnopqrstuvwxyz" 

Вы должны перебираем ARGC на вершине, что ...

for (int i=0;i<argc;++i) { 
    f(argv[i]) .... 
} 

Примечание: вся ваша программа не совсем ясно :-)

+0

Прошу прощения за нечеткий код ... Ну, я сделал то, что вы сказали, и он действительно избавился от ошибки сегментации, однако он читает только 2 символа внутри файла ... – LearningCODE

4

проблема заключается в том, что вы петля на argv[] ищет EOF, что вы не встретите. Таким образом, ваш цикл while выйдет за пределы диапазона, как только i> = argc.

while (argv[i] != EOF){ // ouch !!! 
    ... // process argv[i] 
    ++i; 
} 

Вы должны петли на i<argc:

for (i = 0; i<argc; i++) { 
    ... // process argv[i] 
} 

Другие вопросы:

В качестве общей практики, определяют ваши постоянные строки, как это;

char alpha[] = "abcdefghijklmnopqrstuvwxyz"; //will automatically get the right length 

Однако неправильная длина вы использовали (забывая NUL-терминатор строки) не является причиной вашего дампа ядра, потому что в randomize() доступ к этому массив символов только с переменными, которые строго менее 26, и вы, похоже, не используете функции c-string, зависящие от этого терминатора.

Ваша функция encode() также будет иметь доступ только к индексу от 0 до 25, если бы он был уверен, что кодирование выполняется только на строчных строках. К сожалению, здесь существует риск создания дампа ядра, потому что isalpha(ch)==2 не гарантирует этого: isalpha() возвращает ненулевое значение для буквенно-цифровых символов. Так что лучше использовать islower() вместо:

if (islower(ch)) { //if the selected character is a lowercase then it gets swapped with the "encoded" character. 
    int k = ch; 
    ch = alpha[k-97]; // that's fine because if islower() is true k is between 97 and 122 and thus k-97 is between 0 and 25. 
} 

Еще другие незначительные проблемы:

Аналогичная проблема заключается в make_lower(), где вы должны использовать isupper(). Но здесь не используется индексация, поэтому нет дампа ядра.

Наконец, мне интересно, компилирует ли ch = argv[i];, потому что argv [i] является указателем на char. Поэтому вы должны написать ch = *argv[i];

Смежные вопросы