2015-04-06 8 views
0

получил код, который не будет скомпилирован правильно, потому что он говорит, что мой указатель уже равен нулю, когда я тестирую неточное выражение в моей основной функции. вот код:Ошибка отладки отладки в C

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAXCODE  53 
#define MAXMESSAGE 256 

void getCode(char *codeIn, char *filename) { 

FILE *codeFile; 

/* Open the file with the code */ 
codeFile = fopen(filename, "r"); 

if (codeFile == NULL) { 
    printf("Error opening the code file - program terminated\n"); 
    exit(1); 
} 

/* Read the first (and assumed only) line from the file */ 
fgets(codeIn, MAXCODE, codeFile); 

/* Terminate the string with /0 */ 
codeIn[MAXCODE] = '\0'; 

/* Close the file */ 
fclose(codeFile); 

return; 
} 

int getMessage(int *message, char *filename) { 

FILE *messageFile; 
int counter = 0; 

/* Open the file with the message */ 
messageFile = fopen(filename, "r"); 

if (messageFile == NULL) { 
    printf("Error opening the message file - program terminated\n"); 
    exit(1); 
} 

/* Read one number at a time from the file and store it */ 
while (!feof (messageFile)) 
{ 
    fscanf (messageFile, "%d", (message+counter)); 
    counter++; 
} 

/* Close the file */ 
fclose(messageFile); 

return (counter); 
} 

void sortMessage(int *message, int size) { 

int i, j, temp; 
for (i=0; i<size-1; i++) { 
    for (j=i; j<size; j++) { 
     if (message[i]>message[j]) { 
      temp = message[i]; 
      message[i] = message[j]; 
      message[j] = temp; 
     } 
    } 
} 

return; 
} 

void decodeMessage(char *codeIn, int *message, int size) { 

FILE *outputFile; 
int i = 0; 

/* Open the output file */ 
outputFile = fopen("csis.txt", "w"); 

if (outputFile == NULL) { 
    printf("Error opening the output file - program terminated\n"); 
    exit(1); 
} 

for (i=0; i< size; i++) { 
    fprintf(outputFile, "%c", codeIn[message[i]%100]); 
    printf("%c", codeIn[message[i]%100]); 
} 
printf("\n"); 

/* Close the file */ 
fclose(outputFile); 

return; 
} 
int main(int argc, char *argv[]) 
{ 
    char code[MAXCODE]; 
    int msg[MAXMESSAGE]; 
    int msgSize; 

if (argc != 3) { 
    printf("This program takes two arguments: the name of the file with the code, and the name of the file with the encoded message\n"); 
} 

getCode(code, argv[1]); 
msgSize = getMessage(msg, argv[2]); 
sortMessage(msg, msgSize); 
decodeMessage(code, msg, msgSize); 


return; 
} 

Так в основном мой код использует два файла под названием codefile.txt и msgfile.txt расшифровать секретное сообщение и запись декодированного последовательность в новый текстовый файл с именем КСБР.

+1

Какое сообщение об ошибке вы получаете? – woolstar

+1

'/ * Завершить строку с помощью/0 * /' 'codeIn [MAXCODE] = '\ 0';' Это ошибка. Вы массив не такой большой. – woolstar

+0

Представьте себе, насколько неэффективен мир информационных технологий, если бы мы все заново изобрели колесо каждый раз, когда нам нужно было делать простые вещи, такие как сортировка массива, вместо использования стандартной библиотеки 'qsort' ... – Sebivor

ответ

1

Как указано в комментариях к woolstar, вам не нужно, чтобы NUL закончил ваш массив codeIn после fgets, потому что fgets сделает это за вас. На самом деле, это представляет собой переполнение, которое мы можем лучше всего увидеть, учитывая, что происходит, когда MAXCODE составляет 1: codeIn содержит только один элемент: codeIn[0], и доступ к codeIn[1] является ошибкой.

Аналогично, поскольку MAXCODE является 53 и это, как много элементов, на который указывает codeIn, подозрительно, потому что есть потенциал для message[i]%100 быть недействительным индексом. Хотя мы на этой ноте, было бы разумно сделать message[i]unsigned int так, чтобы он не мог быть отрицательным. Спецификатор формата (для printf и scanf), соответствующий unsigned int, составляет %u.

while (!feof(messageFile)) неправ, потому что флаг EOF не установлен, пока не будет сделана попытка при чтении. Тем не менее, между попыткой чтения и вашим тестом EOF вы увеличили counter, что означает, что вы подсчитали слишком много предметов. Возможно, ваш цикл должен выглядеть следующим образом:

while (fscanf(messageFile, "%d", (message+counter)) == 1) 
{ 
    counter++; 
} 

Обратите внимание, что этот код предполагает, что вы выбрали, чтобы сохранить message[i] как int. Если вы решили использовать unsigned int, конечно, вы захотите использовать спецификатор формата %u.

Возможно, вы видите, что feof в основном избыточно ... Обычно вы можете проверить ошибочные чтения, проверив возвращаемое значение. Старайтесь избегать feof в будущем.

Вашей main функция имеет типа возвращаемого int, но в конце его вы имеете return; заявления, которое не возвращает int значения. Удалите это. Вероятно, это вызывает ошибки во время компиляции.

Предположительно, когда argv != 3 вы хотите вернуться из main так что вы не до конца обработки недопустимых аргументов ... Убедитесь, что вы возвращаете int значение, например,

if (argc != 3) { 
    printf("This program takes two arguments: the name of the file with the code, and the name of the file with the encoded message\n"); 
    return 0; 
}