消费换行符时,为什么我的scanf while循环没有退出?

吕德拉克
// Some initialization code

dup2(fd[0], fileno(stdin));

// This process is receiving the output of "ls -1"

while (scanf("%[^\n]s", someCharArray) > 0) {
    scanf("%*c");
    printf("%s\n", someCharArray);
}

这样可以成功打印所有文件。但是,循环永远不会退出。如果我带走scanf("%*c"),它确实会退出,但是只会打印第一个文件名。

我希望使用换行符将使外部程序准备scanf扫描下一个文件名,这似乎是在做的事情。但是,在扫描完最终文件名之后,我希望嵌套scanf不扫描任何内容。然后外层scanf也不扫描任何东西。并且while循环退出。

为什么会这样呢?

chux-恢复莫妮卡

循环没有退出,因为它正在等待更多输入。

你可以

  1. 发送一对\n\nso,scanf("%[^\n]...因为它无法扫描2nd \n所以返回0 ,或者

  2. 关闭stdin(以特定于实现的方式),所以scanf()returnEOF为负数。

更好地使用fgets()@WhozCraig虽然还不清楚您希望循环在什么条件下结束(而不是stdin闭包)。

while (fgets(someCharArray, sizeof someCharArray, stdin)) {
  // Lop off potential trailing \n if desired
  someCharArray[strcspn(someCharArray, "\n")] = '\0';

  printf("%s\n", someCharArray);
}

注:"s"scanf("%[^\n]s", someCharArray)没有任何用处-放弃它。同样,这种格式没有宽度,也不会限制扫描到的最大字符数,someCharArray并且不应该在质量代码中使用。


我希望使用换行符会准备外部scanf来扫描下一个文件名,这似乎正在做。

是的-没错。较早的版本scanf("%[^\n]...对可能导致未定义行为(UB)的扫描字符数没有限制,那么为什么还要期待其余代码的表现呢?

但是,在扫描完最后的文件名之后,我希望嵌套的scanf不会扫描任何内容。

如果最终的最终文件名'\n'后面有一个scanf("%*c");将使用它。如果最终文件名缺少任何后续字符,scanf("%*c");将耐心等待一个字符。如果输入流已经关闭,它将返回EOF而不是等待。代码未报告/测试的结果,scanf("%*c");因此我们只能猜测。

然后,外部scanf也不会扫描任何内容。并且while循环退出。

是的,如果要扫描的第一个字符是a '\n',它将保留在其中stdinscanf()返回0。如果stdin关闭,scanf()则将返回负数EOF

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我有换行符?

为什么我在 bash while 循环后得到很多换行符?

为什么我的 JTextArea 没有从我的字符串中添加换行符?

为什么我的<div>标签没有给定换行符?

为什么echo`ls -l`没有换行符?

为什么我的 HTML 标签删除了它之前的空格,为什么这里没有换行符?

为什么列要在我的行中间添加一个换行符,而原始数据中没有换行符?

Go-为什么我的For循环会抛出“意外的分号或换行符”?

为什么我的换行符无法正常工作?flex可能有问题吗?

有换行符时,为什么用ld包装printf失败?

python-打印换行符有时不起作用。为什么?

为什么 \n 有时在 javascript 中充当空格而不是换行符?

在检查“退出”字符串时,为什么我的代码没有在循环中终止?

该程序似乎没有退出循环。这是为什么?

当我使用init(contentsOfFile :)创建一个字符串时,为什么还有一个额外的换行符?

为什么xargs输出带有换行符的结果?

为什么单行文本有换行符?

为什么 EOF 在我的 scanf while 循环期间没有终止?

遇到换行符时使用getline退出循环

为什么我的while循环没有停止?

为什么我的while循环没有终止?

我没有在 while 循环中定义

我的代码没有通过“while 循环”

为什么当我<0时,我的while循环没有终止?

为什么当我输入 stop 时我的 while 循环没有停止?

为什么在以下情况下回声后没有插入换行符?

为什么在没有换行符的情况下读取文件更快?

为什么 C puts 附加换行符而 fputs 没有?

为什么在此<pre>标签中没有换行符?