【问题标题】:Issue with fgets while loopfgets while 循环的问题
【发布时间】:2015-09-19 14:58:03
【问题描述】:

目前我有这样的事情:

while(fgets(i, sizeof(i), stdin)!=NULL) {
    printf("%s", i);
    printf("line%d - j", j);
    j++

这会产生类似的东西:

line1
line1 - j
line2
line2 - j
line3line3 - j

我遇到的问题是我抓取的最后一行没有产生新行,第二个打印语句继续在同一行打印。

有人知道如何解决这个问题以使其产生:

line1
line1 - j
line2
line2 - j
line3
line3 - j

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建minimal reproducible example
  • 正在读取的文件的最后一行是否有换行符?
  • "有人知道如何解决这个问题吗?"通过打印“这里应该是新行!”?
  • @Jens 不要这么认为,它只是一个带有一段文字的 .txt 文件。
  • @Olaf 现在应该清楚我所做的编辑了。

标签: c stdin fgets


【解决方案1】:

您应该在使用 printf 编写的每个字符串的末尾添加一些 '\n'。

 while(fgets(i, sizeof(i), stdin)!=NULL) { 
    printf("%s\n", i);
    printf("line%d - j\n", j);
    j++;

这应该可以解决您的问题。 再见!

【讨论】:

  • 不,这将在任何现有的新行之上添加另一个新行,这将修复最后一个条目,但会弄乱前一行的格式。我通过添加以下内容来修复它: if (strchr (line, '\n') != NULL) { printf("%s", line); } else { printf("%s\n", line); }
  • @yezi3 或者,更短的,printf(strchr(line, '\n') ?"%s" :"%s\n", line); 此外,您可以发布自己问题的答案并将其标记为正确。
【解决方案2】:

通过添加检查字符串末尾是否有新行来修复:

if (strchr (line, '\n') != NULL) { 
    printf("%s", line); 
} 
else { 
    printf("%s\n", line);
}

还有李斯特先生建议的更短的版本:

printf(strchr(line, '\n') ?"%s" :"%s\n", line);

【讨论】:

    【解决方案3】:

    由于各种原因,fgets() 的结果可能包括也可能不包括结尾 '\n'
    有的话建议去掉。

    while(fgets(i, sizeof(i), stdin)!=NULL) {
    
      // delete potential \n - this works if \n exists or not
      i[strcspn(i,"\n")] = 0;
    
      printf("%s\n", i);         // add \n
      printf("line%d - j\n", j); // add \n
      j++
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      • 2011-06-19
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 2011-03-04
      相关资源
      最近更新 更多