读书人

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

发布时间: 2012-10-15 09:45:24 作者: rapoo

%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),用于清除缓存区;

读书人网 >C语言

热点推荐