【问题标题】:C - Read text/sentences from file into an array of stringsC - 将文件中的文本/句子读入字符串数组
【发布时间】:2017-03-08 02:44:30
【问题描述】:

我是一名初级程序员,在大学学习。眼下。 我的作业:编写一个基于文本的冒险游戏(经过不到 2 个月的编程学习:/)。

老师说游戏使用的文字,应该保存在一个文件中。 一开始,程序应该从该文件中读取“所有文本”,然后,程序应该使用字符串中的文本(我猜)。

我的第一个想法是我将 1 个句子读入 1 个字符串,但这只是不想解决,因为句子之间当然有空格,但是当我尝试读入时,当程序看到一个空格,它将单词存储在另一个字符串而不是同一个字符串中。

因此,例如: 我的 txt 文件中有 4 行: 第 1 行:你应该走哪条路? 第 2 行:前进 第 3 行:左 第 4 行:右

我认为当我将文本读入 4 个字符串时,第 1 行将在第一个字符串中,第 2 行将在第二个字符串中,依此类推。 但是发生了什么? 'Which' 在第一个字符串中,“way” 在第二个字符串中,依此类推。

很抱歉解释不好,但我希望你们能理解我的问题。 如何仅将第 1 行读入第一个字符串? 我以为程序不会把空格算作“好吧,我应该把这个空格后面的单词放到一个新的字符串中”..

这是导致此“错误”的我的代码:

char decisions[4][200];
FILE *fp;
fp=fopen("text.txt", "r");
fscanf(fp, "%s %s %s %s", &decisions[0], &decisions[1], &decisions[2], &decisions[3]);
fclose(fp);

printf("%s\n %s\n %s\n %s\n", decisions[0], decisions[1], decisions[2], decisions[3]);

decisions[0] 应该从我的 txt 文件的第一行读入问题,而其他 3 个应该有 3 个选择选项。这就是我想要发生的事情:/

【问题讨论】:

  • fgets()
  • 我会研究一下,谢谢你的建议!

标签: c arrays string file scanf


【解决方案1】:

要逐行阅读,您可以使用fgets。如果您知道每个字符串的 MAX 字节为 200 并且您有 4 行,请将其传递给 fgets 进入此循环:

int i;
for (i=0; i<3; i++)
  {
    fgets(decisions[i], 200, fp);
  }

fgets 将 n 个字节读入缓冲区,直到找到新行或 EOF。因此,请确保每行不超过 200 个字符。

【讨论】:

  • 哦,多么棒的答案!您实际上是为我的代码编写的。谢谢伙计,这实际上有很大帮助,现在我开始了解 fgets 的使用 :) 这是我的明确支持! :) 谢谢! :)
【解决方案2】:

虽然您不应该这样做,但您可以使用fscanf 做到这一点。

text.txt的内容

"Whussup?" "All of the things that have not been screwn tightly to the ground" "Buh, who cares!" "You don't wanna know, mate!"
"Why?" "Because!" "Ask Joe!" "I'm a doctor, not an engineer!"

第一行可以解析为:

#include <stdio.h>
#include <stdlib.h>
// ALL CHECKS OMMITTED!
int main()
{
  FILE *fp;
  char decisions[4][200];

  fp = fopen("text.txt", "r");
  fscanf(fp, "\"%199[^\"]\" \"%199[^\"]\" \"%199[^\"]\" \"%199[^\"]\"",
         decisions[0], decisions[1], decisions[2], decisions[3]);
  fclose(fp);
  printf("LINE1: %s\nLINE2: %s\nLINE3: %s\nLINE4: %s\n", decisions[0],
         decisions[1], decisions[2], decisions[3]);
  exit(EXIT_SUCCESS);
}

诀窍是\"%199[^\"]\",它最多占用199 个不是" 的字符,并且在双引号和空格之间。但是text.txt的格式一定要严格,不然不行!

但是说真的,尝试使用fgets或类似的,可以大大减少头痛!

【讨论】:

  • 感谢您的回答!我真的很高兴你写这个只是为了我的代码!虽然,我想我会花时间去理解 fgets,因为对于大量文本来说这看起来更容易。尽管我很欣赏这个答案,但我对此表示赞成!谢谢! :)
【解决方案3】:

在格式字符串中显式使用换行符作为分隔符

fscanf(fp, "%s[\n]%s[\n]%s[\n]%s", &decisions[0], &decisions[1], &decisions[2], &decisions[3]);

【讨论】:

  • 您是否真的尝试过您建议的解决方案?不要认为它会起作用。来自fscanf 关于%s 的手册:“匹配一系列非空白字符”。 OP 输入的第一行有空格。
  • 我想知道堆栈溢出导致无法分离转换说明符%s%[] 的原因。非常好奇。
猜你喜欢
  • 2017-09-12
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
相关资源
最近更新 更多