我想在下面的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部分的print语句继续以无限循环打印。文本文件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
任何人都可以帮我吗?代码是否正确,为什么它从命令行工作以及为什么文件重定向不起作用?帮助将不胜感激...
答案 0 :(得分: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;
}