本帖最后由 major_lyu 于 2020-2-26 19:00 编辑
首先如果scanf读到了合法的数字,status的值就是1。然后后面一个非数字字符会被getchar()读入,并进行比较。如果getchar()读入的是一个非回车字符且status=1时,会继续内层while循环,scanf尝试读取下一个数字,入股读到的是数组,处理方式同上。如果scanf读取时遇到的是非数字字符,则status为0, 无论getchar是否读到回车,都会终止内层和外层循环。如果scanf读取数字成功,status为1,且getchar()读到回车,会跳出内层循环,继续外层while循环。
可以看到,两个数字之间如果只有一个非数字字符,都会被getchar()读取,如果两个数字之间超过两个非数字字符,第二的非数字字符会被scanf读取,并将status置为0,或者输入的字符以非数字字符开始,scanf也会返回0,使得status=0从而循环终止。
你给的例子中的a就是被getchar()读取,进行完内存while的条件判断然后丢弃了。
你可以用下面的代码调试一下,跟踪不同输入时status和ch的值就清楚了。
- #include <stdio.h>
- int main()
- {
- float num=0,sum=0;
- int status;
- char ch;
- do
- {
- printf("请输入合法的数字:");
- do
- {
- sum=sum+num;
- status=scanf("%f",&num);
- }while((ch = getchar())!='\n'&&status==1);
- }while(status==1);
- printf("结果是:%.2f\n",sum);
- return 0;
- }
复制代码