我有一个赋值,当用C编程语言时,我必须从键盘扫描多个数字(只是整数,如果它不是整数,它应该退出)。值除以空格,输入以EOF结束。我需要进一步处理这些扫描值。我知道最多的推杆数字,我事先不知道我会得到多少数字。
我试过了:
while (scanf("%d", &a) == 1 && count <= 10000 ) {
eof=a;
if ( eof=getchar() == EOF ) break;
...
但它似乎并不像我需要的那样工作(通常你必须给EOF两次,但并不总是如此,有时它会为输入增加0)。当我使用时,也会发生同样的事情:
while (scanf("%d", &a) == 1) {
如果我尝试:
while (... && (a=getchar()) != EOF) {
变量a被重写,我无法进一步使用它。
提前致谢。
编辑:此外,我需要区分EOF和无效输入(数字以外的东西),我不知道该怎么办,因为
scanf(...)==1
不会那样做。
答案 0 :(得分:0)
请注意scanf()
0
,1
或EOF
的结果。
int count = 0;
int a;
int scnt;
while ((scnt = scanf("%d", &a) != EOF && count < 10000 ) { // not <= 10000
if (scnt == 0) {
// Handle stdin with unconvertible input. OP wants "it should exit"
puts("Bad");
exit (-1);
} else {
// Success! Let's print it
printf("%d %d\n", count++, a);
}
}
// why did we quit?
if (count >= 10000)
puts("Too many");
else if (feof(stdin)) {
puts("EOF detected");
else if (ferror(stdin)) { // rare
puts("IO error on detected");
else // Should never occur
puts("???");
答案 1 :(得分:-1)
不是扫描整数,而是使用例如一次读取整行。 fgets
,然后从中获取数字。
然后,您可以轻松地将fgets
来电置于循环状态,并且不需要任何其他检查。
如果使用fgets
是不切实际的,那么嵌套循环怎么样,一个外部以文件结束条件(你设置的特殊标志)结束,内部使用例如getchar
阅读所有字符。如果getchar
返回EOF
,则设置外循环的标志并突破内循环。
当然,这意味着你自己解析并整理数字,但除非你必须处理可以由普通标准类型处理的更大数字,否则它是微不足道的。