fscanf覆盖内存中的下一个字节(C)

时间:2013-10-08 00:01:40

标签: c memory malloc overwrite scanf

基本要点是,我正在从文本文件中读取单词,将它们存储为字符串,运行函数,然后多次循环,在每次读取新行时重写该字符串。完成此循环后,我需要处理不同的字符串。问题是,第二个字符串的字节,即使我在声明时将它们memset为0,也会被多于我分配给第一个字符串的空间中的多余字母覆盖:

char* currDictWord = malloc(9*(sizeof(char));
char* currBrutWord = malloc(9*(sizeof(char));
memset(currBrutWord, 0, 9);
memset(currDictWord, 0, 9);

...

while (stuff) {

fscanf(dictionary, "%s", currDictWord);

}

...

printf("word: %s\n", currBrutWord);

currBrutWord将不再为空。我处理这个问题的两种方法是确保currDictWord比字典文件中的最长字(一种贫民窟解决方案)更长,并在循环后在currBrutWord上做一个新的memset。有没有办法告诉C停止将内容写入内存我已经专门为不同的变量分配了什么?

2 个答案:

答案 0 :(得分:1)

是:停止使用fscanf(最好是整个scanf - 系列),然后使用fgets,它允许您传递最大字节数以读入变量。

编辑 :(回应评论)

fgets将停止读取,直到读取count字节或找到换行符,该换行符将出现在字符串中。所以在fgets字符串检查之后是否在它的末尾有一个换行符(并在必要时删除)。如果文件中的字符串fgetc中没有换行符,直到找到一个换行符,如下所示:

fgets(currDictWord, 9, dictionary);
if(currDictWord[strlen(currDictWord) - 1] != '\n'){
    while(fgetc(dictionary) != '\n'); /* no body necssary */
    /* the stream-pointer is now a the beginning of the next line */
}

答案 1 :(得分:0)

不正确的字符串分配以及未验证从文件读取的数据。

currBrutWord因为chars写入了太多currBrutWord而超支。如果你做了就会发生同样的情况:

strcpy(currBrutWord, "123456789");  // Bad as this copy 9+1 char into currBrutWord

使用fscanf()时,可以通过以下方式限制读取的数据:

fscanf(dictionary, "%8s", currDictWord);

会阻止 fscanf()将过多数据放入currDictWord。该部分很好,但您仍然有来自该文件的意外数据。您需要质疑来自外部世界的任何数据。

if (NULL == fgets(bigbuf, sizeof bigbuf, dictionary)) {
  ; handle EOF or I/O error
}
// now parse and validate bigbuf using various tools: strtok(), sscanf(), etc.
int n;
if ((sscanf(bigbuf, "%8s%n", currDictWord, &n) < 1) || (bigbif[n] != '\n')) {
  ; handle error
}