基本要点是,我正在从文本文件中读取单词,将它们存储为字符串,运行函数,然后多次循环,在每次读取新行时重写该字符串。完成此循环后,我需要处理不同的字符串。问题是,第二个字符串的字节,即使我在声明时将它们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停止将内容写入内存我已经专门为不同的变量分配了什么?
答案 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
}