【问题标题】:Looping fscanf causing additional loops (C language)循环 fscanf 导致额外的循环(C 语言)
【发布时间】:2020-09-07 23:27:14
【问题描述】:

我在循环 fscanf 时遇到问题。在下面的代码中(关注 while 循环开始的部分),我循环 fscanf 直到它到达 EOF。从下面的第 2 部分可以看出,到 fscanf 的 .txt 文件只有 6 个字符串,因此 fscanf 应该只循环 6 次然后到达 EOF。但是,从程序输出(下面的第二部分)可以看出,fscanf 循环了 7 次。由于我的程序以相反的顺序显示导弹名称,因此我假设 while 循环最后再循环 1 次,导致第三张图片第一行的空白行输出。

谁能告诉我如何解决这个问题?

C 代码

while(fscanf(readmissiles,"\n %s \n",missilename)!=EOF)
        {
            missilename=malloc(20*sizeof(char));
            insertvalue(LL,missilename);
            missilenum++;
        }

从 FSCANF 到文本文件

单身

飞溅

单身

V-线

H线

单身

输出/显示

/Single 前面有空行显示/

单身

H线

V-线

单身

飞溅

单身

7

【问题讨论】:

  • 使用missilename=malloc(20*sizeof(char)); 覆盖指针值,可能会丢失scanf 的结果。
  • 我解决了这个问题。我使用 fgetc(..)!=EOF 作为循环条件并将我的 fscanf(..) 放入 malloc 下方的循环中。在循环开始时,我使用 fseek(..,-1,SEEK_CUR) 将当前移回一个空格,因为它在循环条件检查期间被 fgetc 移动了。我得到了我想要的输出。这是最佳方式还是有另一种更简单的方式,因为我的方法听起来很愚蠢。

标签: c loops scanf


【解决方案1】:

fscanf 返回扫描的元素数量或EOF,以防出错或在匹配任何内容之前到达文件末尾。在最后一个循环中,fscanf 返回 0 - 它没有扫描元素,但它扫描了 \n,因此它返回 0。做:

while(fscanf(readmissiles, "%s", missilename) == 1)

循环直到扫描到一个元素。

【讨论】:

  • 您好,感谢您的澄清。但是,我尝试了代码 fscanf(...)==1 并且控制台输出给了我 0,我相信这是因为某些原因导致我的循环永远不会开始,因此只输出了 missilenum (最初在每次递增之前声明为 0循环)。
猜你喜欢
  • 1970-01-01
  • 2013-10-26
  • 2021-03-06
  • 1970-01-01
  • 2015-01-11
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多