%s跟%c对于键盘缓冲区的不同的处理

%s和%c对于键盘缓冲区的不同的处理
C/C++ code
#include <stdio.h>

int main()
{
    char b[30];
    char c[30];

    printf( "Input b:\n" );
    scanf( "%s", &b );
    printf( "Input c:\n" );
    scanf( "%s", c );

    printf( "%s\n%s\n", b, c );

    return 0;
}

这样可以正常读入并显示两个字符串。

C/C++ code
#include <stdio.h>

int main()
{
    char a;
    char b[30];
    char c[30];

    printf( "Input b:\n" );
    scanf( "%s", &b );
    printf( "Input c:\n" );
    scanf( "%s", c );
    printf( "Input a:\n" );
    scanf( "%c", &a );

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

    return 0;
}

但是这样会多读出一个'\n'。

C/C++ code
#include <stdio.h>

int main()
{
    char a;
    char b[30];

    printf( "Input a:\n" );
    scanf( "%c", &a );
    printf( "Input b:\n" );
    scanf( "%s", b );

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

    return 0;
}

这样实际上只会输入一次。

我想问的是是不是只有%c才会有这种古怪的特性?以及getchar与%c是不是没有什么不同?看样子%s没有清除结尾的'\n',那就是新的%s会忽略前面的'\n'?

我只要答案,出现任何形式说教的回复都一分不给。我现在满脑子都是二级C,别烦我!

------解决方案--------------------
getchar每次读入一个字符,包括'\n','\0'之类。而%s是字符串输出
------解决方案--------------------
scanf( "%c\n", b );这样就不会接收回车了!
------解决方案--------------------
用scanf( "%c", &a );就不接收回车了
------解决方案--------------------
%s - 忽略控制台输入字符串前后的'\n'和' '
%c - 取缓冲区指针指向的第一个字符.
------解决方案--------------------
%c肯定是会有这个问题的,因为%c是一个字符一个字符读入的,而空格、tab、和回车等都会被读入。当你输入一串字符的时候,首先读入一个字符,然后其他的放在缓存区,等待下次读入。这个问题只在连续输入字符的时候出现。解决办法:
在下次输入%c的前面加fflush(stdio),用于清除缓存区;