scanf和getchar

本文详细探讨了C语言中输入函数scanf与getchar的使用特点,包括如何处理空格、回车符及字符串输入等问题,并提供了实用代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写个简单的小代码,发现用scanf在处理回车空格上面,有点。。网上找了资料,自己也动手试下,结果如follow:

#include<stdio.h>
int main()
{
char a1,b1;                                            //int a1,b1;                                              //char a1[10],b1[10];
scanf("%c",&a1);   //a1=getchar();  //scanf("%d",&a1);  //a1=getchar(); //scanf("%s",a1);    //gets(a1);
scanf("%c",&b1);   //b1=getchar();  //scanf("%d",&b1);  //b1=getchar(); //scanf("%s",b1);    //gets(b1);
printf("%d\n",a1);                                                                                                 //printf("%s\n",a1);
printf("%d\n",b1);                                                                                                 //printf("%s\n",b1);

return 0;
}

scanf接收两个字符型数据送入a1,b1,将其ASCII码打出;;输入a空格b回车;;输出97、35,而不是98。35为空格的ACSII码值,可以在调试器中观察到,b1接收的是‘ ’而非b,将scanf用getchar()代替结果是一样的;这里把输入形式改为a回车b会发现,不论是scanf还是getchar都没等我们输入b就执行结束了,也是把回车作为字符输入到b1中了;

总的来说,对于输入数据类型为char来说,scanf和getchar一样,接受输入缓冲中的空格、回车、Tab;


但是,我们平时使用scanf接受数据时多数还是不会遇到接收space的情况,上面的例子,把a1、b1的类型改为int型时,用scanf,空格、回车是不会被接收的(也就是被丢弃),而对于getchar来说还是会把输入作为char类型数据接受,传给a1,b1时进行一次类型转换,结果就同之前没有什么差别。

scanf、getchar接收字符串string时,如上,使用scanf接收字符串时,输入 i love you 输出为i换行love,即scanf把i作为一个字符串,love作为一个字符串。而使用gets接收字符串时,输入 i love you回车还会是等待输入的状态,再输入 me too!回车,输出显示为 i love you 换行me too!。由此可见,scanf从输入缓冲中取字符串型数据的时候,遇到空格、回车、Tab都会结束此次取字符串,因此,要用scanf接收一个字符串的时候,中间不能有回车、空格、Tab这些;而gets接收的字符串中间可以有空格、Tab,它只以回车作为结束标志;


从hao5473博客上还有看到一个以前遇到的,但一直不明所以也没有注意的问题,就是getchar的“暂停”功能

之前就有遇到,运行程序的时候,结果只是一闪而过,询问superior之后,知道用getchar();可以,但是后来也是发现,有时候行不通。

原来~ getchar()可以用来等待接受我们的结束输入(ENTER),我们没有输入,getchar从输入缓冲中取不到东西,程序就不能终止,知道我们按下ENTER,程序结束;

但是有时候我们的输入缓冲并不是空的(eg.上文中,scanf接收字符串,我们输入的是i love you,而scanf只取走了 i love,you还在输入缓冲中),如果输入缓冲中还有数据的话,getchar直接读取数据,结束程序,这时并不能解决结果一闪而过的问题;

清空输入缓冲的方法:fflush(stdin);



在做oj的时候经常遇到说多组输入的情况,这时就要不停地扫描是否还有输入,那么应该怎样判断是否结束呢?

一般来说使用比较多的是while(scanf("%d",&a)!=EOF)...也有使用while(~scanf("%d",&a))...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值