C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!)

这篇具有很好参考价值的文章主要介绍了C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、前言

二、什么是getchar()函数

三、getchar()函数的返回类型与机制 

四、连续单个字符串 (代码演示)

 五、getchar()函数其他用法,实战演练(重点)

(1)按照题目写出理想代码,but  出现了不理想的效果 

(2)原因分析(原理详解)

(3)解决方法

 (4)再次练手

五、实战演练进阶:输入密码(超重点!!!) 

(1)再次演练

 (2)新的问题

(3)解决方法 

六、共勉


一、前言

    在写这篇文章之前,我对这些基础的函数总是持有一种似懂非懂的感觉没有太在意,直到我在刷题中遇到了满屏的烫烫烫烫烫烫烫烫烫烫烫烫趟或者就是输入字符总是不符合题目格式要求,至此我专门看了一些大佬的文章,做出了我得理解。

二、什么是getchar()函数

getchar()----读取单个字符的函数

注意:此时是读取单个字符

           如果想要读取多个字符用到 gets()函数

三、getchar()函数的返回类型与机制 

C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!)

int  getchar (void)

getchar()函数的返回类型为  int 整型 参数为 void

 此时大家肯定会想,getchar()函数不是用来输入单个字符的吗,为什么返回类型为 int 整型呢 ?

1、getchar其实返回的是字符的ASCII码值(整数)。
2、getchar在读取结束或者失败的时候,会返回EOF。

注意:EOF意思是end of file,本质上是-1.

四、连续单个字符串 (代码演示)

#include <stdio.h>
#include <string.h>
int main()
{
	int ch = 0;  //因为 getchar() 返回类型为 int
	while ((ch = getchar()) != EOF) // 连续输入单个字符
	{
		printf("%c",ch);  // 输出一个字符
		//putchar(ch);    // 此时 printf("%c",ch) 与  putchar(ch)  输出结果一样
  	}

	return 0;
}

 解析:getchar先读取一个字符放到ch里面去,如果这个字符不等于EOF,就进入循环,打印这个字符。当getchar读到文件末尾或者结束时,它会返回一个EOF,此时结束循环。

注意: printf("%c",ch) 与  putchar(ch)  输出结果一样

注意:如果想要结束连续输入  输入:ctrl+z 即可

C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!) 

 五、getchar()函数其他用法,实战演练(重点)

 此时我们来看个经典的牛客例题,来看看平时我们做题的时候如何正确使用 getchar()函数

题目链接:判断是不是字母_牛客题霸_牛客网 

题目描述:KiKi想判断输入的字符是不是字母,请帮他编程实现。请帮他编写程序判断输入的是字母输出(is an alphabet.)不是字母(is not an alphabet.)。

(1)按照题目写出理想代码,but  出现了不理想的效果 

#include<stdio.h>
int main()
{
    char a;
    while ((a = getchar()) != EOF)
    {
        if ((a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z'))
            printf("%c is an alphabet.\n", a);
        else
            printf("%c is not an alphabet.\n", a);
    }
    return 0;
}

按照我们的预想,输出一个字母,就会输出  is an alphabet.   ,不是字母就会输出  is not an alphabet. 我来看一下运行结果。

C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!)

 此时大家会发现和我们预想的不太一样,每一次输出,总是会多输出一个 is not an alphabet. 导致在提交代码的时候出现格式错误。为什么会这样呢?(让人很头痛)

C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!)

             此时对于初学代码的小伙伴是不是想砸电脑了(当时的我直接关机走人,哈哈) 

(2)原因分析(原理详解)

输入函数的原理:

在输入函数中包含了 scanf()函数和 getchar()函数,它们都是从键盘上来读取我们的数据,但它们不是直接从键盘上来读取我们的数据。它们和键盘之间有一个区域叫缓冲区。输入函数先来看缓冲区中是否有数据,如果有,它直接就拿走了,不需要从键盘输入,如果缓冲区什么都没有,则需要从键盘输入,再拿走。

图解:

C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!)

 看懂这个原理后,我们再回到之前的代码上,再次进行代码图解分析。

a = getchar()

代码:getchar()   此时先输入一个字符  例如输入一个 A 吧!

分析:在程序开始运行之后,缓冲区里什么都没有,我们只能通过键盘输入 A ,为了让字符A 进入缓冲区 我们其实不知不觉中输入了  \n  最终在缓冲区里出现的是  A\n

图解:

C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!)

此时缓冲区放了 A\n

注意:getchar() 函数 每次只能取走一个字符 

while ((a = getchar()) != EOF)

因为此时是连续输入,第一个getchar()通过键盘的输入从缓冲区取走了 A ,第二个getcgar()发现缓冲区有一个 \n 刚刚好不需要从键盘输入,直接拿走了 \n 。

C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!)

C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!) 此时经过分析,发现了问题原来每次多输出的那个 is not an alphabet. 就是 \n 导致的呀。

(3)解决方法

此时我们的方向就很明确了,只需要在每次输入完一个字符后先把缓冲区里的请空即可。

此时就用到getchar 的另外一个用法,将缓冲区里面的 \n 清除掉。

在代码中,需要在每次while()循环开始加入 getchar()函数,清除每一次的 \n。

#include<stdio.h>
int main()
{
    char a;
    while ((a = getchar()) != EOF)
    {
        getchar();
        if ((a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z'))
            printf("%c is an alphabet.\n", a);
        else
            printf("%c is not an alphabet.\n", a);
    }
    return 0;
}

C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!)

 此时运行代码,发现终于成功了。

 (4)再次练手

如果大家听懂我上面的讲解,就可以自己去AC 了,另外还有一道同类型的题目大家可以去自己试试,去感受刷题的快感吧!

题目链接:判断是元音还是辅音_牛客题霸_牛客网 

五、实战演练进阶:输入密码(超重点!!!) 

题目:输入一个字符串,自己判断是否为正确的密码,如果正确输入 Y 否则输入 N ,在进行

字符判断 为 Y 输出“确认成功”否则输出“确认失败”。

(1)再次演练

#include<stdio.h>
int main()
{
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);
	printf("请确认密码(Y/N):>");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}
	return 0;
}

C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!) 此时会发现我们还没有输入 Y 或者 N 确认失败自己跳出来了。

 此时大家看到这里,可能已经看出这个代码的问题,跟我们上一道题是相似的问题(大家心里想,就这??,别急后面还有问题的哦!!!)同样我依然用图解来给大家分析。

scanf("%s", password);

C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!)

 从键盘输入密码,我们输入123456。为了让123456放进去,我们还敲了一个回车,所以缓冲区里为123456\n

接下来就是scanf来读缓冲区里的字符串了,scanf读取的方式是读取\n之前的内容,所以读取的是123456.

注意:scanf()读取的是\n之前的内容

printf("请确认密码(Y/N):>");
	int ch = getchar();

C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!)

 getchar看到缓冲区中有数据(\n),直接取走,不需要从键盘输入。自然也就出现了我们上面运行结果的那一幕:还没输入N或Y,就立马跳出“确认失败”了。

同样我们在scanf()输入完后再加入 getchar()清除掉 \n 

#include<stdio.h>
int main()
{
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);
	getchar();//把缓冲区中的\n清理掉
	printf("请确认密码(Y/N):>");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}
	return 0;
}

 此时我们会发现达到了我们的预期效果。C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!)

 (2)新的问题

这次真的达到了预期效果吗,那是当然没有滴不然我早都结尾了,还在这耗着,来看看新问题吧。

当我们输入密码为123456 789时(中间有一个空格),还没等我们输入N或Y,又立马跳出了“确认失败”。
这又是怎么回事呢?我们一起来看看

首先缓冲区里没有东西,我们需要通过键盘输入密码123456 789

C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!)

 注意:然后scanf就来取缓冲区中的数据,当它读到空格的时候,它就不再读了(这是scanf的一个作用性质)。所以scanf就只取走了123456,而缓冲区中还剩下(空格) 789\n。

C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!)

 再往下

getchar();

然而这里只有一个getchar,它只能读取一个字符,也就是只读了空格缓冲区中还剩789\n。

C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!)

 再往下

int ch = getchar();

getchar()一来就取走了缓冲区中的7,根本不需要我们从键盘输入N或Y。运行时自然它就自动跳出了“确认错误”。

(3)解决方法 

我们需要把缓冲区中的东西先全部清走。
那我们就用一个循环,只要没读到\n,我们就一直用getchar读。

//把缓冲区中的内容全读走
	while ( getchar() != '\n')
	{
		;
	}

看完整代码:

#include<stdio.h>
int main()
{
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);
	//把缓冲区中的内容全读走
	while (getchar() != '\n')
	{
		;
	}
	puts(password);  // 验证输入的字符串
	printf("请确认密码(Y/N):>");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}

	return 0;
}

C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!)

 

测试成功!!!!

六、共勉

以下就是我对getchar()函数的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对其余函数的理解,请持续关注我哦!!!!!!!!  

C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!) 

 文章来源地址https://www.toymoban.com/news/detail-462437.html

到了这里,关于C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【目标检测实验系列】YOLOv5模型改进:融入坐标注意力机制CA,多维度关注数据特征,高效涨点!(内含源代码,超详细改进代码流程)

            自我介绍:本人硕士期间全程放养,目前成果:一篇北大核心CSCD录用,两篇中科院三区已见刊,一篇中科院四区在投。如何找创新点,如何放养过程厚积薄发,如何写中英论文,找期刊等等。本人后续会以自己实战经验详细写出来,还请大家能够点个关注和赞,收藏一

    2024年01月20日
    浏览(82)
  • 3.1 多维度随机变量及其分布

          要学习二维随机变量及联合分布,我会按照以下步骤进行: 了解基本概念:首先要了解二维随机变量的概念,即同时包含两个随机变量的变量。还要了解二维随机变量的取值范围以及联合概率密度函数和联合分布函数的定义。 学习联合分布函数的性质:联合分布函数

    2024年02月06日
    浏览(66)
  • SpringBoot进阶教程(七十六)多维度排序查询

    在项目中经常能遇到,需要对某些数据集合进行多维度排序的需求。对于集合多条件排序解决方案也有很多,今天我们就介绍一种,思路大致是设置一个分值的集合,这个分值是按照需求来设定大小的,再根据分值的大小对集合排序。 我们来模拟一个需求,现在需要查询一个

    2024年02月08日
    浏览(56)
  • Python多维矩阵的各个维度表示(axis = ......)

    在python中对多维矩阵进行操作时,往往要指定操作的维度,一般用0,1,-1这样的数字表示矩阵的某一维度。二维矩阵还是好分辨数字表示的维度的,但对于三维矩阵或更高维度的矩阵就不好分辨了。这里只说明三维矩阵的三个维度怎么分辨。 以一个三维矩阵按不同维度求和

    2024年02月13日
    浏览(38)
  • AIGC ChatGPT 实现动态多维度分析雷达图制作

    雷达图在多维度分析中是一种非常实用的可视化工具,主要有以下优势: 易于理解: 雷达图使用多边形或者圆形的形式展示多维度的数据,直观易于理解。 多维度对比: 雷达图可以在同一张图上比较多个项目或者实体在多个维度上的表现。 数据关系明显: 通过雷达图,可

    2024年02月11日
    浏览(50)
  • 异构区块链的多维度安全检测方案

    摘 要 :异构区块链多维度安全检测方案可以为多样化的区块链平台安全性检测提供统一的测评标准和检测方法,辅助相关部门对区块链平台进行有效检测和监管,促进区块链行业的合规发展。通过分析现有区块链安全检测的需求,针对目前多样性的区块链底层平台,提出普

    2024年02月05日
    浏览(44)
  • 多维度聊一聊 k8s 和 openstack

    k8s 和 openstack 无疑是当今云计算领域的两大巨头,它们分别占据着 IaaS 和 PaaS 领域的事实标准,经常被拿来一起比较。我记得大概在三四年前 k8s 如火如荼的发展的时候,“openstack 已死”,“openstack 没落了”之类的文章层出不穷。但是这么年过去了 openstack 老当益壮依然在云

    2024年01月22日
    浏览(47)
  • 笔记:对多维torch进行任意维度的多“行”操作

    新建torch 取出某一行 取出某一列 一次性取出多行 取出连续的多行 ——有多种操作方式 取出不连续的多行 如:取出第0行和第2行 一次取出多列 取出连续的多列 ——同样拥有多种方案 取出不连续的多列 如取出第0列和第3列 此三维torch可视化如下: 取出三维torch的任意两行(

    2024年02月01日
    浏览(76)
  • 抛开价格,DBeaver真的比Navicat好用吗?多维度测评来了!!!

    今天看到一个很有意思的话题“抛开价格,DBeaver真的比Navicat好用吗?” ,正好自己最近使用的数据库连接工具比较多,两个软件都有使用过,我以自己的使用体验给你对比一下,从这个方面去对比: 1、下载难易 DBeaver是个开源软件,比较容易利用现有的网络资源找到安装包。

    2024年02月16日
    浏览(46)
  • Matlab 线性拟合、一维、多维度非线性拟合、多项式拟合

      线性拟合 我随便设定一个函数然后通过解方程计算出对应的系数 假设我的函数原型是 y=a*sin(0.1*x.^2+x)+b* squre(x+1)+c*x+d  拟合系数:   利用matlab实现非线性拟合(三维、高维、参数方程)_matlab多元非线性拟合_hyhhyh21的博客-CSDN博客 简单的一维的拟合: 思路: 将非线性-》线

    2024年02月12日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包