OJ上scanf的输入问题

来源:互联网 发布:大蚂蚁软件 编辑:程序博客网 时间:2024/05/20 22:28

OJ上scanf的输入问题

关于scanf的使用,可以参考一下这篇博客
在OJ上的输入,以这个题目为例:

输入数据:

30 50*

输出数据:

1500

首先输入两个数字,然后在下一行输入一个字符,通常理我们会用如下方式输入:

int a, b;char c;scanf("%d%d", &a, &b);scanf("%c", &c);

但是当我们尝试输入的时候就会发现不对劲,刚刚输入完1 2按下回车,程序就已经执行完了,是scanf("%c", &c);没有执行吗?
其实并不是,当我们输出一下abc的值,就会发现,a、b分别为30、50,没有问题,而c的值却为’\n’,也就是说,c读入的其实是换行这个符号。
为什么会这样呢?我们把输入数据看做一个字符串,其实就是30 50\n*,换行也只不过是一个符号而已。scanf中的%d%d匹配完两个数字之后,下一个字符就是’\n’,而此时scanf("%c", &c);检测到’\n’,就将这个字符读入。
那么,要怎么解决这个问题呢?开头的那篇博客里就有解决方案,就是在"%d%d"后面在加上一个空格或者’\n’等空白符,这样,scanf函数在匹配完数字后,会自动忽略掉后面的空白符号,直到有非空白符号被读入为止。
因此,对于这个题目,标准的解法应该是这样的:

#include <stdio.h>int main(){    int a,b;    char ch;    scanf("%d%d ",&a,&b);    /*    scanf("%d%d\n",&a,&b);     最后添加空格或者\r、\n都是可以的    */    scanf("%c",&ch);    switch(ch)    {    case '+':        printf("%d",a+b);        break;    case '-':        printf("%d",a-b);        break;    case '*':        printf("%d",a*b);        break;    case '/':        printf("%d",a/b);        break;    }    return 0;}
原创粉丝点击