本题关键在于scanf函数的返回值
scanf()函数返回值分为3种:
(1)返回正整数。表示正确输入参数的个数。
(2)返回整数0。表示用户的输入不匹配,无法正确输入任何值。
(3)返回-1。表示输入流已经结束。在Windows下,用户按下CTRL+Z(会看到一个^Z字符)再按下回车(可能需要重复多次),就表示输入结束;Linux/Unix下使用CTRL+D表示输入结束。
while(~scanf(“%d%d”, &a, &b))
就相当于 scanf(“%d%d”, &a, &b) != EOF
关于~的作用解析:
1、在Windows下,用户按下CTRL+Z(会看到一个^Z字符),会停止输入流,scanf会返回-1。
2、-1的补码为11111111 11111111 11111111 11111111 一共4个字节。
3、~是C语言中的按位取反,因此~(-1)结果为00000000 00000000 00000000 00000000刚好为整数0的补码。
4、因此当输入Ctrl+Z时,scanf会返回-1,while(~-1)==while(0),0为假,退出while循环。
只有~(-1)取反是0
所以作用是只有输入ctrl+z才停止
scanf(“%d%d”, &a, &b);
如果a和b都被成功读入,那么scanf的返回值就是2
如果只有a被成功读入,返回值为1
如果a和b都未被成功读入,返回值为0
如果遇到错误或遇到end of file,返回值为EOF。
此外写成2 == scanf()格式是一种编程风格~防止由于程序员手误写成”=”
getchar(); 不写的话碰到1+1=?会死循环,getchar();遇 到scanf输入异常时 getchar清空缓存区数据;
#include <stdio.h>#include <string.h>#include <iostream>#include <cmath>using namespace std;int main(){ char op; int a,b,c,k,score=0; while(~(k=scanf("%d%c%d=%d",&a,&op,&b,&c))) { if(4==k) { if(op=='+' && c==a+b) score++; else if (c==a-b) score++; } else { getchar(); } } printf("%d",score); }
0.0分
2 人评分
C二级辅导-等差数列 (C++代码)浏览:2308 |
C二级辅导-分段函数 (C语言代码)浏览:912 |
C语言训练-谁家孩子跑最慢* (C语言代码)浏览:1544 |
C语言程序设计教程(第三版)课后习题9.6 (C语言代码)浏览:596 |
C语言程序设计教程(第三版)课后习题9.8 (Java代码)浏览:1674 |
C语言程序设计教程(第三版)课后习题9.6 (C语言代码)浏览:287 |
Pascal三角 (C语言代码)格式错误浏览:551 |
C语言程序设计教程(第三版)课后习题8.3 (C语言代码)浏览:790 |
【出圈】 (C语言代码)浏览:824 |
DNA (C语言描述,蓝桥杯)浏览:1653 |