// 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循环退出。
为什么会这样呢?
循环没有退出,因为它正在等待更多输入。
你可以
发送一对\n\n
so,scanf("%[^\n]...
因为它无法扫描2nd \n
,所以返回0 ,或者
关闭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'
,它将保留在其中stdin
并scanf()
返回0。如果stdin
关闭,scanf()
则将返回负数EOF
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句