比较scanf()函数和getchar()函数在接收字符时的差异

如题所述

getchar()
getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,如果stdin有数据的话不用输入它就可以直接读取了。
for(int i=0;i<10;++i)
{
char ch=getchar();
printf ( "ch=%c\n", ch );
}当输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读取,并显示到屏幕上。
如果我想让getchar()每次都能够等待用户输入的话就要清空缓冲区,
c标准规定
fflush()函数是用来刷新输出(stdout)缓存的。对于输入(stdin),它是没有定义的。但是有些编译器也定义了
fflush(
stdin
)的实现,比如微软的vc。其它编译器是否也定义了
fflush(
stdin
)的实现应当查找它的手册。gcc编译器没有定义它的实现,所以不能使用
fflush(
stdin
)来刷新输入缓存。对于没有定义
fflush(
stdin
)的编译器,可以使用
fgets()函数来代替它(比用
getchar()、scanf()等函数通用性好)。可以这样忽略输入流中留下的回车等其它输入,从而使下一次的输入总保持一个“干净”的状态。(这个是任何平台下都可以的)
for(int i=0;i<10;++i)
{
char ch=getchar();
fflush(stdin); //每次都会有等待状态了(vc平台)
printf ( "ch=%c\n", ch );
} scanf()scanf这个库函数比较奇怪,而且存在一定的缺陷,所以很多人都不用了。
scanf输入字符串,整型,实型等数据判断的方式都一样,回车,空格,tab键都认为是一个数据的结束,当然字符的话,一个字符就是结束了,回车,空格等都有对应的ascii码,所以用scanf输入字符时要小心这些东东被当成字符输进去,而输入字符串和整型,实型等数据时这些都被当成分隔符而不会被输入到字符数组或变量里。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-02-09
getchar()
getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,如果stdin有数据的话不用输入它就可以直接读取了。
for(int i=0;i<10;++i)
{
char ch=getchar();
printf ( "ch=%c\n", ch );
}当输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读取,并显示到屏幕上。
如果我想让getchar()每次都能够等待用户输入的话就要清空缓冲区,
C标准规定
fflush()函数是用来刷新输出(stdout)缓存的。对于输入(stdin),它是没有定义的。但是有些编译器也定义了
fflush(
stdin
)的实现,比如微软的VC。其它编译器是否也定义了
fflush(
stdin
)的实现应当查找它的手册。GCC编译器没有定义它的实现,所以不能使用
fflush(
stdin
)来刷新输入缓存。对于没有定义
fflush(
stdin
)的编译器,可以使用
fgets()函数来代替它(比用
getchar()、scanf()等函数通用性好)。可以这样忽略输入流中留下的回车等其它输入,从而使下一次的输入总保持一个“干净”的状态。(这个是任何平台下都可以的)
for(int i=0;i<10;++i)
{
char ch=getchar();
fflush(stdin); //每次都会有等待状态了(VC平台)
printf ( "ch=%c\n", ch );
} scanf()scanf这个库函数比较奇怪,而且存在一定的缺陷,所以很多人都不用了。
scanf输入字符串,整型,实型等数据判断的方式都一样,回车,空格,tab键都认为是一个数据的结束,当然字符的话,一个字符就是结束了,回车,空格等都有对应的ascii码,所以用scanf输入字符时要小心这些东东被当成字符输进去,而输入字符串和整型,实型等数据时这些都被当成分隔符而不会被输入到字符数组或变量里。
第2个回答  2020-03-14
getchar每次只能获得一个字符,并返回其ascii值。scanf的格式比较多,如%c获取一个字符,%d获得一个整数,%s获取一个字符串
getchar能获得所有字符,scanf中有些需要使用空格等分隔,所以空格和回车等会被忽略。
第3个回答  推荐于2016-09-06

getchar()
getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,如果stdin有数据的话不用输入它就可以直接读取了。

for(int i=0;i<10;++i)
{
char ch=getchar();
printf ( "ch=%c\n", ch );
}

当输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读取,并显示到屏幕上。
如果我想让getchar()每次都能够等待用户输入的话就要清空缓冲区, C标准规定 fflush()函数是用来刷新输出(stdout)缓存的。对于输入(stdin),它是没有定义的。但是有些编译器也定义了 fflush( stdin )的实现,比如微软的VC。其它编译器是否也定义了 fflush( stdin )的实现应当查找它的手册。GCC编译器没有定义它的实现,所以不能使用 fflush( stdin )来刷新输入缓存。对于没有定义 fflush( stdin )的编译器,可以使用 fgets()函数来代替它(比用 getchar()、scanf()等函数通用性好)。可以这样忽略输入流中留下的回车等其它输入,从而使下一次的输入总保持一个“干净”的状态。(这个是任何平台下都可以的)

for(int i=0;i<10;++i)
{

char ch=getchar();
fflush(stdin); //每次都会有等待状态了(VC平台)
printf ( "ch=%c\n", ch );
} scanf()

scanf这个库函数比较奇怪,而且存在一定的缺陷,所以很多人都不用了。
scanf输入字符串,整型,实型等数据判断的方式都一样,回车,空格,tab键都认为是一个数据的结束,当然字符的话,一个字符就是结束了,回车,空格等都有对应的ascii码,所以用scanf输入字符时要小心这些东东被当成字符输进去,而输入字符串和整型,实型等数据时这些都被当成分隔符而不会被输入到字符数组或变量里。

追问

用下面的scanf函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1=‘A‘,c2=‘a‘,问在键盘上如何输入?
void main()

int a,b;
float x,y;
char c1,c2;
scanf("a=%d b=%d",&a,&b);
scanf("x=%f y=%e",&x,&y);
scanf("c1=%c c2=%c",&c1,&c2);

追答

a=3 b=7
x=8.5 y=71.82
c1=A c2=a
最后有个回车

本回答被提问者和网友采纳
第4个回答  2019-02-19
getchar每次只能获得一个字符,并返回其ascii值。scanf的格式比较多,如%c获取一个字符,%d获得一个整数,%s获取一个字符串
getchar能获得所有字符,scanf中有些需要使用空格等分隔,所以空格和回车等会被忽略。
相似回答