c语言:scanf(" %c",&bla); scanf("%c",&bla); 语句差别

%前有空格,%没有空格

scanf("%c",&c) 与 scanf(" %c",&c),后者只是在%前多了个空格,似乎没有什么区别,但使用起来区别是很大的。

scanf()作单字符输入时规定只接收一个字符但它却把回车符也作为字符对待的这个回车符是放在缓冲区的,但是空格却是直接忽略掉

这就造成程序中第二次调用scanf("%c",&c)是从缓冲区中取一个字符,把第一次调用scanf("%c",&c)后输入的回车当作输入字符了。

这就在输入逻辑上造成了混乱。

有了scanf(" %c",&c)这个空格(换成\n或者\t也可以),这样就把缓冲区中的回车当成第一个字符,读取后丢掉。

#include <stdio.h>
int main()
{
    char bla,blb;
    scanf("%c",&bla);
    scanf("%c",&blb);
    printf("%c    %c\n",bla,blb);
    bla=bla+32;
    blb=blb+32;
    printf("%c    %c\n",bla,blb);
    getchar();
}

本次运行输入U Y结果如左图,本来应该显示: u    y

本次运行输入T R结果如左图,     本来应该显示:t      r

但每次结果都是*
分析原因:*(ASCII:42)  每输入U   Y    T    R时都回车,末尾都有换行,换行符(ASCII:10), 10+32=42,对应的字符是*

主要是输入 第一个字符后回车换行,存入键盘缓冲区,第二次使用scanf()时直接使用了换行符,根据换行符进行了计算,所以每次都出现*

解决方法:将“与%加个空格

#include <stdio.h>
int main()
{
    char bla,blb;
    scanf(" %c",&bla);
    scanf(" %c",&blb);
    printf("%c    %c\n",bla,blb);
    bla=bla+32;
    blb=blb+32;
    printf("%c    %c\n",bla,blb);
    getchar();
}

scanf(" %c\n",&bla);该语句一定不能添加\n,否则不能完成输入

posted @ 2021-04-08 15:27  myrj  阅读(171)  评论(0编辑  收藏  举报