请教一段有关scanf函数只允许输入数字的代码
#include <stdio.h>
int main(void)
{
int a;
char ch;
while (scanf("%d", &a) != 1)
{
printf("Input errror,try again:");
for ( ; (ch = getchar())!='\n' && ch != EOF; )
{
continue;
}
}
printf("%d\n", a);
return 0;
}
================================================================================================
以上代码的功能是直到输入为数字为止才停止输入。刚学C,很多不懂,请高手指教,因为最近在写一些分数录入的小程序,需要用到这个。若单纯只定义一个INT型常量,在输入非数字字符时会有问题。于是找来了这么一段代码,但是不大理解,主要是(VC6.0环境下):
1.while中的判断条件是判断scanf是否能成功赋值?
2.那么里面的for是何用的?
3.若直接在while循环体中使用continue为什么不能达到不是数字就重新输入的功能?
4.getchar函数所获得的值是从哪来的?是从没成功赋值的scanf那里传来的?
[解决办法]
外层 while循环的是直到读取了长度为1的一个整型数字,也就是说只能输入一个个位数。
里面的for循环是清空输入缓存的,只要有字符就读取,除非遇到换行和结束。
[解决办法]
#include <stdio.h>
int main(void)
{
int a;
char ch;
while (scanf("%d", &a) != 1) /*判断 scanf("%d",&a) 是否等于1,是继续循环,否则结束(你输入的是整型数字 scanf("%d",&a) 为‘真’
则是1,不是整型或其它字符为‘假’,则是0 )*/
{
printf("Input errror,try again:");
for ( ; (ch = getchar())!='\n' && ch != EOF; )
{
continue;;; /*这个continue是跳出for循环,我刚用break也试了下,效果一样的*/
}
}
printf("%d\n", a);
return 0;
}
[解决办法]
1,是的。scanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF。
2,如果起初检索用户输入的“东西”,如果不是换行符(回车)和eof,那么for循环接着执行,如果遇到换行符和eof,则for循环停止,进入while(scanf("%d", &a) != 1) 的判断,此时再次扫描用户所输入的“东西”,如果第一个字符是数字的话,则把该数字给a,while条件不满足,跳出,输出a
例如:
aInput errror,try again:3e3e3er3Press any key to continue
[解决办法]
scanf()函数返回成功赋值的数据项数
scanf() 中的 %d 指明要读入 int, 如果没有满足要求的输入,则返回 0
[解决办法]
int main(){ int a, n; char ch; while ((n = scanf("%d", &a))!= 1) { printf("Input error,try again:\n"); printf("n = %d\n", n); for ( ; (ch = getchar())!='\n' && ch != EOF; ) { continue; } } printf("a = %d\n", a); printf("n = %d\n", n); system("pause"); return 0;}