c语言scanf、gets、getchar的使用以及深度剖析使用细节

目录

一:getchar(先来分析一下最简单的)

二:gets

三:scanf

四:总结:


一:getchar(先来分析一下最简单的)

getchar——>get char 翻译过来就是拿一个字符,而且这个家伙的胃口很大,什么字符都拿,所以使用getchar的时候请务必想清楚上一句残留下来在缓冲区的回车啊、空格啊等等东西。

也正是因为它什么都吃的这种特性,我么通常会用getchar来吃掉一些我么不想要的东西,下面讲到gets和scanf的时候你们会有很深的领悟,我本人也喜欢在一些程序下面放两个getchar来稍微的暂停一下(让我的脑子调代码的时候缓口气,因为手动了脑子就不动了)。

然后我们看一下getchar的函数原型:


这图有点小你们凑合着看(这烦人的鸟图怎么就放不大呢)。

函数的返回值是int型,就是返回读取到的字符的ASCII值,函数的参数就是流,这玩意抽象,但是也不难理解,这里我们先暂且理解为缓冲区就好了,以后学文件的时候就很清楚了。

函数使用:


#include<stdio.h>//头文件别忘了
int main()
{
    char c=getchar();//参数放空就是从缓冲区拿东西
    printf("%c",c);
    getchar();//让程序写个脚
    getchar();
}

二:gets


返回类型是char*类型的,也就是一个指针,函数的参数是你要把读取的东西放到哪里,你就将哪里的首地址作为参数,数组名就是数组首元素的地址(一定是char*型的地址)。

返回值其实我们不用太在意它读取成功的时候返回什么,我们只需要知道函数读取字符串失败的时候返回NULL,也就是空指针就可以了,这对于控制输入次数很重要。

我们知道scanf也是可以读取字符串的,但gets和scanf有着很大的区别:(scanf后面再将)

gets读取字符串的时候,只有读取到回车符号才会停止,不会因为空格或者\t就跳出,gets读取到回车符的时候会把回车符从缓冲区中拿掉,然后在字符串的最后补上'\0'。

所以有如下的坑你的代码:


#include<stdio.h>
int main()
{
	char c;
	char arr1[100]="\0";
	c = getchar();
	gets(arr1);
	printf("%c\n", c);
	printf("%s",arr1);

当你输入a回车的时候,你还想在敲几个字符让gets读取的时候,你就会发现程序已经执行完了,原因就是上一个语句残留下来的回车被gets拿了,然后gets就有点伤心什么都没拿还在arr1里面放了一个'\0',所以打印出来的结果就是。

a

三:scanf

刚开始学c语言的时候就学的这个函数,这里我们就不在介绍过多,直接来说几个重要的点:

1.scanf用%c读取字符也是什么都吃

2.scanf读取double类型的数据要用%lf,而不像printf那样可以用%f

3.scanf用%s读取字符串:重点重点

        scanf用%s读取字符串的时候,他会跳过开头的回车符、空格、跳格符去读取字符,只要开始读取了字符后面一遇到回车符、空格、跳格符就会退出读取,而且不会把最后读到的回车、空格、跳格符从缓冲区中拿走,这跟gets是不一样的。

下面上一段代码让你感受一下不同:


#include<stdio.h>
int main()
{
    char arr1[100];
    char arr2[100];
    scanf("%s",arr1);
    gets(arr2);
    printf("%s\n%s\n",arr1,arr2);
}

当我们输入一串字符回车之后准别再输入一串的时候,你会发现程序执行完了,arr2什么都没有读取到,就是因为scanf没有把回车拿走。

如果scanf和gets反过来呢?

#include<stdio.h>
int main()
{
    char arr1[100];
    char arr2[100];
    gets(arr2);
    scanf("%s",arr1);
    printf("%s\n%s\n",arr1,arr2);
}

这次我们就可以正常的输入了。

两个scanf呢?


#include<stdio.h>
int main()
{
    char arr1[100];
    char arr2[100];
    scanf("%s",arr1);
    scanf("%s",arr2);
    printf("%s\n%s\n",arr1,arr2);
}

这次也是正常的,因为即使上面的scanf留下了回车,也由于scanf会跳过开头的回车,所以可以正常的输入。

两个gets呢?


#include<stdio.h>
int main()
{
    char arr1[100];
    char arr2[100];
    gets(arr1);
    gets(arr2);
    printf("%s\n%s\n",arr1,arr2);
}

这次也是正常的,因为gets会把回车符拿掉。

scanf的返回值:scanf如果读取到东西返回的是读取到的数据的个数,如果读取到文件结束符号,就会返回-1。所以经常有如下的操作:

#include<cstdio>
using namespace std;
int main()
{
    int n;
    while(scanf("%d",&n)==1)
    {
        //.......    
    }

}

四:总结:

        由于gets不会因为空格或者跳格符而停止,所以可以用于输入有空格、跳格符的字符串,

然后要特别注意gets和scanf两者的区别。

给我点点赞咯(一个赞一道题目,助力一下我这不知死活的梦想)。

  • 62
    点赞
  • 129
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值