本题关键在于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语言程序设计教程(第三版)课后习题10.1 (C语言代码)浏览:670 |
C语言考试练习题_排列 (C++代码)浏览:638 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:560 |
C语言训练-列出最简真分数序列* (C语言代码)浏览:505 |
不容易系列2 (C语言代码)浏览:597 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:702 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:542 |
IP判断 (C语言描述,蓝桥杯)浏览:1095 |
模拟计算器 (C++代码)浏览:806 |
循环入门练习6 (C语言代码)浏览:968 |