我在C中很新,我以前在Python工作,我试图看看我读的是否是整数。如果没有,请阅读,直到我设法输入一个号码。
我做了一些研究,我发现函数scanf
实际上返回1,如果读取是适当的,否则为0。
所以,我已经编写了这段代码,而且我不明白为什么这是一个无限循环,编写"给出一个整数"在控制台上
#include <stdio.h>
int main() {
int a;
int b = 1;
do {
printf("Give an integer\n");
b = scanf("%d", &a);
} while (b == 0);
}
答案 0 :(得分:2)
scanf()
的问题在于,当"%d"
等大多数说明符遇到第一个空格时,它会停止读取,所以它留在输入中,这就是为什么再次读取会导致问题的原因不要丢弃这样的空格,因为它会在您下次调用时立即返回。按 Enter 或返回,'\n'
换行符(或换行符)时会引入强制性空白区域)。
如果你想读取一个整数并确定你做了,你可以试试这个
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int
main(void)
{
long int value; // You can adapt this to use `int'
// but be careful with overflow
char line[100];
while (fgets(line, sizeof(line), stdin) != NULL) {
char *endptr;
value = strtol(line, &endptr, 10);
if ((isspace(*endptr) != 0) && (endptr != line))
break;
}
fprintf(stdout, "%ld\n", value);
return 0;
}
阅读strtol()手册以了解此代码
您可以按照评论中的建议,从输入中删除空格字符,但是恕我直言,你仍然会遇到scanf()
的其他问题,就像处理不直接的空输入一样。< / p>
答案 1 :(得分:1)
我不明白为什么这是一个无限循环,在控制台上写“给一个intiger”
问题是scanf()
不会使用与指定格式无法匹配的数据。它会在输入流中保留未读取的此类字符。因此,如果您尝试使用相同的格式从同一个流中再次读取,而不通过其他方式消耗至少一个字符,那么您可以确定输入将再次不匹配。然后再次。再一次。
为避免无限循环,每次匹配失败后,您需要至少消耗一个不匹配输入的字符。有很多方法可以做到这一点;这是一个相当简单的:
#include <stdio.h>
int main() {
int a;
do {
printf("Give an intiger\n");
if (scanf("%d", &a)) {
// breaks from the loop on a successful match or an error
break;
}
// consume the remainder of one line of input without storing it
if (scanf("%*[^\n]") == EOF) {
break;
}
} while (1);
}
它消耗了遇到非匹配输入的行的整个剩余部分,这将为某些输入产生比许多替代方案更少的令人惊讶的交互行为。
如果您喜欢编写简洁代码,或者如果您不喜欢break
在循环中间,那么您可能会写出相同的内容:
#include <stdio.h>
int main() {
int a;
do {
printf("Give an intiger\n");
} while ((scanf("%d", &a) == 0) && (scanf("%*[^\n]") != EOF));
}
由于&&
运算符短路,第二次scanf()
调用仅在第一次返回零时执行,并且循环将在第一次迭代后退出,其中第一次scanf()
call返回非零值,或者第二个返回EOF
(表示错误)。