浅谈C语言中scanf(),gets(),getchar()函数区别与联系

众所周知,scanf函数和gets函数是从键盘输入数据的函数。其基本函数功能这里不做过多赘述,只对两个函数易错点深入分析。

int main()
{
	char a[20];
	char b[20];
	char c[20];
	printf("请输入a字符串\n");
	scanf("%s",&a);
	printf("请输入b字符串\n");
	gets(b);
	printf("请输入c字符串\n");
	gets(c);
	return 0;
}

【分析】程序本意是输入三个字符串,之所以用printf提示输入是因为想更清楚地看清程序怎么运作的,可以从运行界面看到程序提示输入a字符串和c字符串,但是会越过b字符串不让输入。这里会让人感到困惑。

因为scanf函数在读取字符串时,遇到回车、空格、制表符不会进行读取或转换,会舍弃掉它们以及它们后面的字符至缓冲区,最后在读取的字符后面加上‘\0’.因此到了gets(b)的时候就会读取缓冲区剩下的东西以及最后的换行符就结束了,所以程序不会提示输入b字符串,但是从监视可以看到b中其实是读取了字符串的。然后缓冲区无剩余字符gets(c)可以实现输入c字符串。而且从这个程序也可以体现出来需要用到里面有空格的字符串的时候可以用gets函数。

这里还有一个注意点:在gets(c)读取从键盘输入的字符以及最后需要将缓冲区的数据刷新出去的回车符。它和scanf不同的是不会舍弃回车符至缓冲区中, 而是会丢弃换行符将其改为字符串结束标志‘\0’。所以我们一般喜欢使用这种带有清理收尾工作的输入函数。

最后一个点,我们可以看到b字符串其实读取的是缓冲区中的垃圾数据。因此,为了避免输入流缓冲区中垃圾数据对后续读入的影响,需要清空缓冲区。

下面就介绍方法(不同平台)
   C标准规定 fflush()函数是用来刷新输出(stdout)缓存的。对于输入(stdin),它是没有定义的。但是有些编译器也定义了 fflush( stdin )的实现,比如微软的VC。其它编译器是否也定义了 fflush( stdin )的实现应当查找它的手册。GCC编译器没有定义它的实现,所以不能使用 fflush( stdin )来刷新输入缓存。
   对于没有定义 fflush( stdin )的编译器,可以使用 fgets()函数来代替它(比用 getchar()、scanf()等函数通用性好)。可以这样忽略输入流中留下的回车等其它输入,从而使下一次的输入总保持一个“干净”的状态。(这个是任何平台下都可以的)

scanf函数读取字符

int main()
{
	char ch1;
	char ch2;
	char ch3;
	char ch4;
	scanf("%c",&ch1);
	scanf("%c",&ch2);
	scanf("%c",&ch3);
	scanf("%c",&ch4);
	return 0;
}

【分析】用户输入‘h‘和‘ ‘和两个回车符,在监视中可以看到,四个字符如愿以偿得到了用户输入操作的四个字符,也并没有舍弃回车符到缓冲区。

总结:scanf使用所有格式码,遇到回车,换行,制表符不会进行读取或转换其及其以后的字符,但是%c除外。

时间: 2024-08-01 23:09:09

浅谈C语言中scanf(),gets(),getchar()函数区别与联系的相关文章

浅谈Java语言中try{}catch{}和finally{}的执行顺序问题

浅谈Java语言中try{}catch{}和finally{}的执行顺序问题 2019-04-06  PM  13:41:46  1. 不管有没有出现异常,finally块中代码都会执行: 2. 当try和catch中有return时,finally仍然会执行: 3. finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的:

C语言中malloc()和free()函数的具体作用

本文想就C语言中malloc()和free()函数的具体作用做出一些说明,这些细节大家在使用过程中很有可能会忽略. 在C语言中要动态的释放内存,就必然要用到指针,将动态分配获得的空间地址赋值给指针.C语言中动态分配内存的函数为malloc(), 在用完后,要及时调用free()函数释放.理论上,这样是安全的,但其实这样是不安全的,因为free()函数仅仅是告诉操作系统,这块空间我不用了,操作系统收回空间.而指向这块空间的指针并没有改变,它的值仍然指向这块空间.这样,我就可以继续使用该指针操作内存

R语言中 fitted()和predict()的区别

fitted是拟合值,predict是预测值.模型是基于给定样本的值建立的,在这些给定样本上做预测就是拟合.在新样本上做预测就是预测. 你可以找一组数据试试,结果如何.fit<-lm(weight~height,data=women)fitted(fit) predict(fit,newdata=data.frame(height=90))##将90代入看结果如何这是R in action中的例子 R语言中 fitted()和predict()的区别,布布扣,bubuko.com R语言中 fi

C语言中strcpy与memcpy函数实现与区别

C语言中strcpy与memcpy函数是怎么实现的又有哪些区别呢?下面就与我来简单的介绍下吧,希望大家多给点意见,欢迎评论纠正错误. 6.2 字符串与数组 字符串一般是用字符数组的方式存储,例如下面的str定义: char str[] = "123456"; 这里str是一个字符数组,它存放了一个字符串"123456",由于字符串还有一个结束符"\0",所以此数组的长度为7而不是6. 6.2.1 strcpy函数与memcpy函数 strcpy和

Java语言中extend和implement的区别

Java语言并不支持多重继承,而只能继承一个类,不过我们可以使用implements来实现多个接口. extends继承的父类:不能声明为final或者定义为abstract: implements实现接口interface,用逗号分开就好: 如:class A extends B implements C, D, E interface的引入是为了部分地提供多继承的功能. 在interface中只需声明方法头,而将方法体留给实现的class来做. 这些实现的class的实例完全可以当作inte

c语言中scanf()、printf()函数

函数调用scanf(“%d”,  &weight) 包含两个参数:“%d” 和&weight.C用逗号来隔开函数调用中的多个参数: 但是printf()和scanf()函数比较特殊,其函数数目可以不受控制. 例如,我们可以使用1个.2个.3个甚至4个参数调用printf()函数.而程序需要知道参数的数目才能正常工作,这两个函数通过第一个参数确定后续参数的个数,方法是第一个参数字符串中的每个说明符对应了后面的一个参数. 以下语句包含两个格式说明符:%d 和%d printf(“%d cats

C语言中malloc()和free()函数解析

1.malloc()和free()的基本介绍 (1)函数原型及说明 void *malloc(long NumBytes) 该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返回一个空指针(NULL). void free(void *FirstByte) 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由. (2)函数基本用法 1 char *Ptr = NULL; 2 Ptr = (char *)malloc(1

浅谈分布式计算系统和集群系统的区别

随着项目经验的增长笔者对分布式计算的了解是越来越深入,那么接下来笔者就和大家浅谈下分布式系统的特点吧,可以这样理解,分布式系统是将多个子任务分布在不同的物理机上并行工作.是以空间换时间并行计算来提高程序的可靠性和性能.分布式系统的高性能计算属于MIMD的范畴领域.它是按不同的业务分配不同的节点(单点),组织比较松散,一个节点垮掉那么些节点负责的业务就不能正常处理,当然,技术到位肯定会有其他解决方案例如基于Remoting通信方案WCF通信方案. 而采用集群方案,同样提供10台服务器,每台服务器都

C语言中sizeof与strlen 的区别

sizeof与strlen是有着本质的区别,sizeof是求数据类型所占的空间大小,而strlen是求字符串的长度,字符串以/0结尾.总的来说sizeof把'\0'也给数上了,而strlen遇到'\0'就停止计数了.区别如下:(1) sizeof是一个C语言中的一个单目运算符,而strlen是一个函数,用来计算字符串的长度.(2)sizeof求的是数据类型所占空间的大小,而strlen是求字符串的长度实例1:printf("char=%d/n",sizeof(char)); //1pr