C中的调试断言错误

时间:2015-04-06 02:39:06

标签: c debugging assertion decoder

这里有一些代码无法正确编译,因为当我在main函数中测试一个非null表达式时,它说我的指针已经为空。这是代码:

#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的文件来解码秘密消息,并将解码后的序列写入一个名为csis的新文本文件。

1 个答案:

答案 0 :(得分:1)

正如woolstar在评论中指出的那样,你不需要在codeIn之后终止你的fgets数组,因为fgets会为你做到这一点。实际上,这构成了溢出,我们可以通过考虑MAXCODE为1时发生的情况来最好地看到:codeIn只包含一个元素:codeIn[0],访问codeIn[1]是一个错误。

同样,由于MAXCODE53codeIn指向的元素数量,codeIn[message[i]%100]是可疑的,因为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; } 值,例如

{{1}}