我正在尝试在下面的 C 程序中执行简单的 scanf
和 printf
:
- 获取用户输入
- 检查用户输入是否正确,如果正确则打印出来,否则显示错误消息
这是代码:
#include <stdio.h>
int main() {
int latitude;
int scanfout;
int started = 1;
puts("enter the value:");
while (started == 1) {
scanfout = scanf("%d", &latitude);
if (scanfout == 1) {
printf("%d\n", latitude);
printf("ok return code:%d\n", scanfout);
puts("\n");
} else {
puts("value not a valid one");
printf("not ok return code:%d\n", scanfout);
}
fflush(stdin);
}
return 0;
}
尝试在命令终端上编译并运行它,程序可以工作。 命令行输出:
enter the value:
1
1
ok returncode:1
0
0
ok returncode:1
122.22
122
ok returncode:1
sad
value not a valid one
not ok returncode:0
如您所见,该程序只是扫描用户输入并将其打印出来,它在命令行中工作正常,但是当它尝试将输入重定向到文本文件时,请说:
test < in.txt
程序无法运行,else 部分中的打印语句会无限循环地继续打印。文本文件 in.txt
包含单个值 12
,程序不会打印 12
,而是简单地进入无限循环并打印:
value not a valid one
not ok returncode:0
value not a valid one
not ok returncode:0
value not a valid one
not ok returncode:0
value not a valid one
not ok returncode:0
有人可以帮我解决这个问题吗?代码是否正确,为什么它可以在命令行工作以及为什么文件重定向不起作用?帮助将不胜感激...
最佳答案
您不测试文件结尾:扫描输入文件后,程序会进入无限循环,因为 scanf
返回 -1
,程序会提示并重试。
顺便说一句,如果输入文件中存在无法转换为 int
的数据,程序将永远循环尝试重新解析相同的输入,但徒劳无功。
请注意,C 标准中未指定 fflush(stdin);
,它可能会或可能不会执行您期望的操作,尤其是在文件中。
这是更正后的版本:
#include <stdio.h>
int main() {
int latitude, scanfout, c;
puts("enter the value:");
for (;;) {
scanfout = scanf("%d", &latitude);
if (scanfout == 1) {
printf("%d\n", latitude);
printf("ok return code:%d\n", scanfout);
puts("\n");
} else
if (scanfout < 0) {
break; // End of file
} else {
puts("value not a valid one");
printf("not ok return code:%d\n", scanfout);
}
/* read and ignore the rest of the line */
while ((c = getchar()) != EOF && c != '\n')
continue;
}
return 0;
}
关于C : File redirection is not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34324072/