将文本文件中的字符串扫描到数组中出现问题



假设我有一个简单的words。txt文件,其内容如下:

house
car
horse

那么我想把这些单词扫描到一个数组中那么words[0]就是house, words[1]就是car等等。所以我有这个问题,我似乎有一个无限while循环,为什么呢?我对单词的扫描是否正确?

#include <stdio.h>
#include <stdlib.h>
#define MAX_WORDS 10
int main() {
FILE *f;
f = fopen("words.txt", "r");
char words[MAX_WORDS];
int i = 0;
while(1) {
fscanf(f, "%s", &words[i]);
if(feof(f)) {
break;
}
i++;
}
fclose(f);
return 0;
}

你的数组可以容纳1一个字或n个字符序列。你想要的是一个字符串数组。第一个维度必须有MAX_WORD尺寸和第二个维度必须有MAX_WORD_LEN尺寸

#include <stdio.h>
#include <stdlib.h>
#define MAX_WORDS 10
#define MAX_LEN 51
int main() {
FILE *f;
f = fopen("words.txt", "r");
char words[MAX_WORDS][MAX_LEN]; /* Can hold MAX_WORDS string of MAX_LEN chars */
int i = 0;
while(1) {
fscanf(f, "%50s", words[i]);
if(feof(f) || i == MAX_WORDS - 1) {
break;
}
i++;
}
fclose(f);
return 0;
}

首先,您应该考虑存储字符串的数组。记住,字符串本身就是数组。当您知道单词的最大长度时,就很容易定义这个字符数组:

#define MAX_WORD_LEN 32
char words[MAX_WORDS][MAX_WORD_LEN];

那么你可以像这样读取每个字符串

fscanf(f, "%s", words[i]);

注意:您的代码可能导致缓冲区溢出,因为您没有检查变量i"%s"被认为是不安全的(像gets),因为它假设读取字符串适合缓冲区。如果可能,不要使用这些,否则只有在您信任输入时才使用这些:Never:scanf("%s", ...);gets(...)

如果你知道宽度,你可以像这样使用scanf:

char str[11];
scanf("%10s", str); // one less than the buffer size

最新更新