1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <stdio.h> int main(int argc, char *argv[]) { int a, b,result; char op; scanf("%d%c%d", &a,&op,&b); switch(op) { case '+': result =a+b; break; case '-': result =a-b; break; case '*': result =a*b; break; case '/': result =a/b; break; case '%': result =a%b; break; default: break; } printf("%d\n", result); return 0; } |
这段程序的变化是把 scanf 放到了 while 中,作为循环的判断条件, 然后把其他部分放到了 循环体 { }
如果 scanf 没有读到这三个数,会返回 EOF,表示未能成功读取。
还记得经典的【文件复制】(《C程序设计语言 第二版新版》第11页)吗? 是不是有点像?
1 2 3 4 5 | 3+4 15/6 17%4 9-6 9*7 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include <stdio.h> int main(int argc, char *argv[]) { int a, b,result; char op; while (scanf("%d%c%d", &a,&op,&b)!=EOF) { switch(op) { case '+': result =a+b; break; case '-': result =a-b; break; case '*': result =a*b; break; case '/': result =a/b; break; case '%': result =a%b; break; default: break; } printf("%d\n", result); } return 0; } |
scanf 会返回正确读取的数据个数,在这个例子中,应该正确读取 a, op 和 b
如果你编写的程序有问题,每次编译后都要输入这些测试数据,岂不是很麻烦?
现在就轮到 scanf 的师兄 fscanf 出场了