scanf,getchar和gets的用法和区别

相信很多新手朋友都在scanf,getchar和gets的使用上产生过困惑,尤其是处理字符和字符串时,博主先前就遇到这样的困惑,但一直都是一知半解,今天终于经过一番折腾弄清了它们的用法和区别,下面我们就详细来看看。

一、书写格式和作用

scanf

char a;
scanf("%c",&a);
/*读入一个字符,注意&不能漏*/
char a[10];
scanf("%s",a);
/*读入一个字符串,注意a是数组名,代表的就是数组的首地址,所以a前面没有&*/

getchar

char c;
c=getchar();
/*读入一个字符*/
getchar();
/*从缓冲区吸收一个字符,至于什么是缓冲区,下文会说到*/

gets

char a[10];
gets(a);
/*读入一个字符串*/

二、缓冲区

在此不具体介绍缓冲区,如果感兴趣可自行上网查看,我们只需要知道:

首先我们从键盘上输入的字符或者字符串是放入内存的缓冲区中的,并且按照先后顺序存储在缓冲区,当我们调用一次scanf或getchar或gets时都是从缓冲区中取出,举个例子,当我们从键盘上依次输入a,s,d,f,回车键,则缓冲区存储如下图(假设输入这些字符之前,缓冲区没有字符,如果有则在a之前靠近出口的位置):
如果我们执行scanf("%c",&b)之前缓冲区存储上述字符,那么scanf是是怎样执行的的?它是从键盘上输入一个字符赋值给b吗?当然不是,因为此时缓冲区中还有字符,scanf从出口读入一个字符,也就是a,此时就把a赋值给了b;同理我们执行b=getchar(),也就是将a赋值给b;执行gets(b),b的值就是asdf。

三、具体细节

以下都是基于缓冲区中无字符

scanf

scanf("%c",&a);
/*从键盘输入一个字符赋值给a,剩下所有字符(包括空格、回车、Tab)存储在缓冲区.注意的是scanf读取单个字符时能读取上述三个字符.*/
scanf("%s",a);
/*从键盘上输入一个字符串赋值给数组a,遇到空格、回车、Tab结束,剩下所有字符(包括空格、回车、Tab)存储在缓冲区,并在字符串后自动添加‘\0’作为结束标志.注意的是scanf读取字符串时不能读取上述三个字符.*/

错误展示:

#include<stdio.h>
int main()
{char a,b;
 scanf("%c",&a);
 scanf("%c",&b);
 printf("%c\n",a);
 printf("%c\n",b);
 return 0}

运行结果:
解析:我们从键盘上输入a后按回车,a和回车符都被存储到了缓冲区,a被第一个回车符读取,回车符被第二个scanf读取,因此输出a后换两次行。

getchar

c=getchar();
/*从键盘上输入一个字符赋值给c,剩下所有字符(包括空格、换行、Tab)存储在缓冲区.注意的是getchar能读取上述三个字符,因此常用getchar()吸收回车符.解决上述scanf错误展示,我们就可以在两个scanf之间加上getchar()吸收回车符避免上述错误.*/

gets

gets(a);
/*从键盘上输入字符串赋值给数组a,遇到回车结束,并在字符串后自动添加‘\0’作为结束标志.注意的是gets能读取空格、Tab,但不能读取回车符.*/

以上就是全部scanf,getchar和gets的用法和区别。ps:以上是博主的个人理解,如有错误,欢迎指出。如有帮助,感谢点赞。
另外我觉得对于新手朋友要想真正理解上述内容,还得自己动手不断改写程序通过比较运行结果来感受。比如我就是通过以下程序知道gets是不能读取回车符的:

#include<stdio.h>
int main()
{char a[10];
 char b;
 scanf("%c",&b);
 gets(a);
 printf("%s",a);
 return 0;
}

运行结果
在这里插入图片描述

  • 305
    点赞
  • 1278
    收藏
    觉得还不错? 一键收藏
  • 28
    评论
### 回答1: getchar是一个函数,它从标准输入中读取一个字符,不会跳过空格、换行符等;gets是一个函数,它从标准输入中读取一行字符,会跳过空格、换行符等;scanf是一个函数,它从标准输入中读取一行字符,并将其转换为指定的数据类型。 ### 回答2: getchargetsscanf都是C语言中用于输入的函数,但是它们有一些区别。 首先,getchar函数用于获取一个字符输入。它会从标准输入中读取一个字符,并返回这个字符的ASCII码值。getchar函数是以逐字符为单位读取输入的,即每次只能读取一个字符。如果需要读取字符串,则需要通过循环调用getchar函数多次。 其次,gets函数用于读取一行字符串输入。它会从标准输入中读取一个字符串,并将其存储在指定的字符数组中。相比于getchar函数,gets函数可以读取整行输入,但是它存在一个严重的安全问题,即无法控制输入字符串长度,容易造成缓冲区溢出漏洞。 最后,scanf函数是一个格式化输入函数,可以根据指定的格式从标准输入中读取不同类型的数据。scanf函数可以读取字符、字符串、整数、浮点数等各种类型的数据。通过指定格式字符,可以按照一定的格式读取输入数据,并将其存储到相应的变量中。与gets函数相比,scanf函数可以实现一些输入验证,对输入数据进行格式化处理。 总结来说,getchar函数适用于读取单个字符;gets函数适用于读取一行字符串,但存在安全问题;scanf函数适用于按照格式读取各种类型的数据,并进行简单的输入验证。在实际使用中,需要根据不同的需求选择合适的输入函数。 ### 回答3: getchar()、gets()和scanf()是C语言中常用的输入函数,它们的主要区别如下: 1. getchar()函数:用于从标准输入流中逐个读取字符。它会忽略空白字符,只返回非空白字符。该函数每次只读取一个字符,并且返回该字符的ASCII码值。 2. gets()函数:用于从标准输入流中读取一行字符串。它会读取输入中的所有字符,直到遇到换行符为止。该函数把读取到的字符串存储在指定的字符数组中,并在末尾添加一个空字符('\0')作为字符串的结束标志。 3. scanf()函数:用于从标准输入流中按指定格式读取数据。它可以根据格式字符串的指定规则,将输入中的数据按照指定类型存储到相应的变量中。scanf()可以读取多个数据,不仅限于字符串,还可以读取整数、浮点数等。 这三个函数的应用场景不同: - getchar()常用于需要逐个读取字符的情况,比如输入密码、验证码等。 - gets()常用于读取一行字符串,但由于不检查输入长度,容易导致缓冲区溢出,不建议使用。 - scanf()可以按照格式化的要求进行数据输入,适用于各种类型的输入操作。 总结来说,getchar()读取单个字符,gets()读取一行字符串,而scanf()则根据格式化字符串按需读取不同类型的输入数据。在实际应用中,要根据需求选择合适的函数以确保输入数据的正确性和安全性。
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值