0

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

4

2 回答 2

1

是的:停止使用fscanf(最好是整个scanf系列),fgets而是使用它,它可以让您传递要读入变量的最大字节数。

编辑:(回应评论)

fgets将停止读取,直到读取count字节或找到换行符,这将在字符串中。因此,在fgetsing 字符串后检查它的末尾是否有换行符(并在必要时删除)。如果文件中的字符串中没有换行符,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 */
}
于 2013-10-08T00:06:26.970 回答
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
}
于 2013-10-08T17:00:38.787 回答