【问题标题】:Problem scanning a string from a text file into an array将文本文件中的字符串扫描到数组中时出现问题
【发布时间】:2021-01-21 21:32:06
【问题描述】:

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

house
car
horse

所以我想将这些单词扫描到一个数组中,这样单词 [0] 将是房子,单词 [1] 将是汽车等。所以我遇到了这个问题,似乎我有一个无限的时间循环,这是为什么呢?我是否正确地扫描了这些单词?

#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;
}

【问题讨论】:

  • &amp;words[i] 只能容纳一个字符!也许你想要数组数组?

标签: c


【解决方案1】:

您的数组可以包含 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;
}

【讨论】:

  • 谢谢,没想到这么简单
【解决方案2】:

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

#define MAX_WORD_LEN 32

char words[MAX_WORDS][MAX_WORD_LEN];

然后你可以像这样读取每个字符串

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

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

如果你知道宽度,你可以将它与 scanf 一起使用,如下所示:

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

【讨论】:

  • @costaparas 对。但它会起作用,因为它会导致相同的地址,但另一种类型:而不是char[](转换为char*)它将是char(*)[],因为在几乎所有平台上,指向数组的指针都包含与指向该数组的第一个元素的指针相同的地址。
  • 我指的错字是&amp;words[i] 应该是words[i](现已更正)。前者会给出一个编译器错误,所以它不会“工作”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-30
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多