繁体   English   中英

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

[英]fscanf overwriting next bytes in memory (C)

基本要点是,我正在从文本文件中读取单词,将它们存储为字符串,运行一个函数,然后循环多次,每次读取新行时都重写该字符串。 完成此循环后,我需要处理其他字符串。 问题是,即使我在声明时将它们设置为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做一个新的内存集。 有没有办法告诉C停止将内容专门写给我为另一个变量分配的内存?

是的:停止使用fscanf (最好是整个scanf -family),而改用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 */
}

字符串分配不正确,并且不验证从文件读取的数据。

currBrutWord已超限,因为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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM