代码改变世界

scanf的一个问题(暂未解决)

2013-08-09 16:12  清心朗静  阅读(274)  评论(0编辑  收藏  举报

如下代码,没有按照预想的那样运行:

    int a;
    char b;

    printf("input a integer\n");
    scanf("%d", &a);
    
    printf("input a char\n");
    //scanf("%1s",&b);
    scanf("%c",&b);

    printf("%d,%c\n",a,b );

运行的结果如下,并没有机会输入char字符,输入int后,回车直接就显示了。

----------------------------------------------------------------------------

原因分析:

输入int数值后,回车,此时连同回车一起进入了缓冲区,而b获取字符变成了回车符。

解决方案:

重点是要忽略到回车。

(1)用函数fflush(stdin)清除全部剩余内容 ==>OK

(2)用"%1s"来限制 ==>OK

(3)用getchar()清除

(4)用格式串中空格或"%*c"来"吃掉" 

 

方法一:

    int a;
    char b;

    printf("input a integer\n");
    scanf("%d", &a);
    
    printf("input a char\n");
    fflush(stdin);
    scanf("%c",&b);

    printf("%d,%c\n",a,b );


方法二:

 %1s 读长度为1的字符串,因此前面的空格,回车都会过滤掉。

    int a;
    char b;

    printf("input a integer\n");
    scanf("%d", &a);
    
    printf("input a char\n");
    scanf("%1s",&b);

    printf("%d,%c\n",a,b );

 运行结果:

但程序结束报错:

修改如下即可:

将b定义为字符数组(字符串)

    int a;
    char b[2];

    printf("input a integer\n");
    scanf("%d", &a);
    
    printf("input a char\n");
    scanf("%1s",&b);
 
    printf("%d,%c\n",a,b[0]);

方法三、