【C语言的秘密】密探—深究C语言中多组输入的秘密!

这篇具有很好参考价值的文章主要介绍了【C语言的秘密】密探—深究C语言中多组输入的秘密!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

场景引入:

         你是否在刷题过程中,经常遇到以下场景呢?

场景一:

【C语言的秘密】密探—深究C语言中多组输入的秘密!,c语言

场景二:

【C语言的秘密】密探—深究C语言中多组输入的秘密!,c语言

从这些题上都能看见输入描述中提出了一条多组输入,那啥是多组输入?如何实现它呢?

多组输入:在输入数据时,有多组数据需要分别处理的情况

接下来探究如何利用循环实现它。

如果还有不会循环的小伙伴可以看我之前写的一篇文章:初阶C语言-分支与循环结构-CSDN博客


📚常用的输入函数的介绍

📖字符类

📝getchar(字符输入函数,包含头文件stdio.h即可使用)

getchar
int getchar (void)

可用cplusplus官网查找到函数原型如下:

【C语言的秘密】密探—深究C语言中多组输入的秘密!,c语言

📌函数讲解

函数名                         getchar

函数的参数                  void

函数的返回类型            int

1.成功读取到字符则返回字符的ASCII码值

2.读取失败则返回EOF(-1)   

【C语言的秘密】密探—深究C语言中多组输入的秘密!,c语言

选择EOF右击鼠标找到转到定义选项,点击。

【C语言的秘密】密探—深究C语言中多组输入的秘密!,c语言

可发现,EOF就是#define定义的常量,它的值就是-1,EOF的意思是the end of file,文件末尾标志。

💌举例:

#include <stdio.h>

int main()
{
	int ch;
	ch = getchar();

	return 0;
}

【C语言的秘密】密探—深究C语言中多组输入的秘密!,c语言

☑️getchar函数的作用是从标准输入流读取(获得)一个字符,可以简单的理解为接收键盘输入的一个字符。这里我是从键盘输入字符a,可以看见ch这个变量存储的就是字符a对应的ASCII码值97

💌举例:

【C语言的秘密】密探—深究C语言中多组输入的秘密!,c语言

☑️这里我输入的是2,但是getchar会默认把我输入的2当做字符,输出字符2对应的ASCII码值50赋值给ch。

🤔如果输入字符串或者多位数的整数会有啥结果?

😶只会取第一个读到的字符。

📝putchar(字符输出函数,包含头文件stdio.h即可使用)

putchar
int putchar (int character)

【C语言的秘密】密探—深究C语言中多组输入的秘密!,c语言

📌函数讲解

函数名                       putchar

函数的参数                int character

函数的返回类型         int 

1.成功读取到字符则返回字符的ASCII码值,并在屏幕上输出读取到的字符

2.读取失败则返回EOF(-1)

💌举例:

#include <stdio.h>

int main()
{
	int ch;
	int a;
	ch = getchar();
	a = putchar(ch);

	return 0;
}

【C语言的秘密】密探—深究C语言中多组输入的秘密!,c语言

☑️第一个a是我输入给getchar函数,第二个a是程序执行到putchar函数,在屏幕上(终端)上打印的字符a。ch接收了getchar函数的返回值,a接受了putchar函数的返回值,这里都是字符a对应的ASCII码值97。

📝字符类的多组输入

💌举例:设置一个程序,只有当输入的字符为数字时才将其输出

#include <stdio.h>

int main()
{
	int ch;
	while ((ch = getchar()) != EOF)
	{
		if (ch >= '0' && ch <= '9')
		{
			putchar(ch);
			printf("\n");//单纯打印一个字符换个行,方便观察
		}
	}

	return 0;
}

【C语言的秘密】密探—深究C语言中多组输入的秘密!,c语言

☑️多组输入按control+z+回车即可退出。

💌举例:场景一

【C语言的秘密】密探—深究C语言中多组输入的秘密!,c语言

#include <stdio.h>

int main()
{
	int ch;
	while ((ch = getchar()) != EOF)
	{
		if (ch >= 'A' && ch <= 'Z')//大写字母
			putchar(ch + 32);
		else if (ch >= 'a' && ch <= 'z')//小写字母
			putchar(ch - 32);
		printf("\n");//换行方便观察
	}

	return 0;
}

【C语言的秘密】密探—深究C语言中多组输入的秘密!,c语言

☑️大小写字母的ASCII码值之间相差了32。

🤔思考:同样是换行方便观察,为啥输出结果是这样呢?

😶事实上你输入的是字母然后按了个回车(ASCII码值是10),回车是转义字符'\n',等于你输入了两个字符。

【C语言的秘密】密探—深究C语言中多组输入的秘密!,c语言

☑️细心的你会发现上一个例题是满足条件才printf("\n"),而这次是经过一次循环就会进行一次printf("\n")。

改进:

#include <stdio.h>

int main()
{
	int ch;
	while ((ch = getchar()) != EOF)
	{
		if (ch >= 'A' && ch <= 'Z')//大写字母
		{
			putchar(ch + 32);
			printf("\n");
		}
		else if (ch >= 'a' && ch <= 'z')//小写字母
		{
			putchar(ch - 32);
			printf("\n");
		}
	}

	return 0;
}

【C语言的秘密】密探—深究C语言中多组输入的秘密!,c语言

📖万能类

📝scanf(包含头文件stdio.h即可使用)

【C语言的秘密】密探—深究C语言中多组输入的秘密!,c语言

💌举例:

#include <stdio.h>

int main()
{
	char password[20];
	printf("请输入密码:");
	scanf("%s", password);//数组名就是地址,可以不加&
	printf("请确认你的密码:(Y/N)");
	int ch = getchar();
	if (ch == 'Y')
		printf("确认成功\n");
	else
		printf("确认失败\n");

	return 0;
}

【C语言的秘密】密探—深究C语言中多组输入的秘密!,c语言

🤔思考:为啥都没有让我输入Y/N就确认失败了呢?

😶输入缓冲区的引入

【C语言的秘密】密探—深究C语言中多组输入的秘密!,c语言

注:因为getchar读到的是缓冲区内的字符'\n'(回车),故出现了bug。

改进:在引入一个getchar读走\n,这个操作叫做清空缓冲区。

#include <stdio.h>

int main()
{
	char password[20];
	printf("请输入密码:");
	scanf("%s", password);//数组名就是地址,可以不加&
	printf("请确认你的密码:(Y/N)");
	getchar();//处理掉缓冲区的\n
	int ch = getchar();
	if (ch == 'Y')
		printf("确认成功\n");
	else
		printf("确认失败\n");

	return 0;
}

其他清理缓存区的办法:

使用gets函数代替scanf函数接收字符串的输入

【C语言的秘密】密探—深究C语言中多组输入的秘密!,c语言

#include <stdio.h>

int main()
{
	char password[20];
	printf("请输入密码:");
	gets(password);
	printf("请确认你的密码:(Y/N)");
	int ch = getchar();
	if (ch == 'Y')
		printf("确认成功\n");
	else
		printf("确认失败\n");

	return 0;
}

【C语言的秘密】密探—深究C语言中多组输入的秘密!,c语言

gets函数还会顺带把缓冲区的\n一起带走。

🤔思考:若是读取整数的函数需要单独处理掉缓冲区的\n吗?

😶不需要,因为\n不是整数不会被读取。

📝scanf函数的多组输入

#include <stdio.h>

int main()
{
	char arr[20];
	while (scanf("%s", arr) != EOF)
	{
		printf("%s\n", arr);
	}

	return 0;
}

【C语言的秘密】密探—深究C语言中多组输入的秘密!,c语言

注:按三次control+z+回车即可退出多组输入。可以思考一下为啥这次不需要清空缓冲区。

【C语言的秘密】密探—深究C语言中多组输入的秘密!,c语言

可见scanf函数读取时以空格或者回车作为一次读取结束标志,当是循环时,输入空格分隔开的一串字符串会被识别为两串字符串。

若要对scanf输入字符串中就是含有空格可使用以下格式:

scanf("%[^\n]", arr);
#include <stdio.h>

int main()
{
	char arr[20];
	scanf("%[^\n]", arr);
	{
		printf("%s\n", arr);
	}

	return 0;
}

#include <stdio.h>

int main()
{
	char arr[20];
	while (scanf("%[^\n]", arr) != EOF)
	{
		printf("%s\n", arr);
	}

	return 0;
}

比较可惜的是这样会死循环,因为这种格式带不走缓冲区的内容,他只是把\n之前的字符拷贝一份放到了arr中,所以缓冲区一直有abcd abc,所以死循环了。

改进:

#include <stdio.h>

int main()
{
	char arr[20];
	while (scanf("%[^\n]", arr) != EOF)
	{
		printf("%s\n", arr);
		int ch;
		while ((ch = getchar()) != EOF && ch != '\n')//清空缓冲区
		{
			;
		}
	}

	return 0;
}

注:按两次control + z +回车即可退出多组输入。

📚总结

        本节介绍了多组输入以及相关输入函数,如何清空(输入)缓冲区的一些方法。在进行多组输入时,尤其使用能读取字符,字符串的函数时,小心未清理缓冲区而产生bug。文章来源地址https://www.toymoban.com/news/detail-754088.html

到了这里,关于【C语言的秘密】密探—深究C语言中多组输入的秘密!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【C语言】scanf多组输入的三种方法!

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,相信大家都多多少少了用过scanf语句吧,但是对scanf函数没有全面的认识仅仅只是知道可以输入。    ⛳️ 今天博主就给大

    2024年02月06日
    浏览(34)
  • 【初阶C语言】关于scanf函数的超详细介绍和多组输入

    感谢各位可以光临娥子的作品   我们学习一个函数,要围绕三个点 :1.函数是什么  2.函数的用法   3.注意的细节 认识一个 函数,我们需要了解他的功能、返回值、接收的参数三个方面 函数原型  (1)功能介绍          scanf函数是一个输入函数 ,所以接收的参数类型需

    2024年02月08日
    浏览(36)
  • 【Linux】C语言中多线程的创建、退出、回收、分离

    线程是轻量级的进程(LWP:light weight process),在 Linux 环境下线程的本质仍是进程。在计算机上运行的程序是一组指令及指令参数的组合,指令按照既定的逻辑控制计算机运行。操作系统会以进程为单位,分配系统资源,可以这样理解, 进程是资源分配的最小单位,线程是操

    2024年02月09日
    浏览(32)
  • 解锁AI语言模型的秘密武器 - 提示工程

    想让你的AI变成聊天高手?掌握提示工程,让你的AI不仅仅是个回答机器,而是你智能的生活小助手! ‍ 首先,你得知道什么是LLMs(大型语言模型),它们是怎么构建的,以及为什么我们需要提示工程。然后,你会学到如何用分隔符来区分数据和提示,怎样要求结构化输出(

    2024年02月06日
    浏览(27)
  • 探索C语言的数据类型:解密编程世界的核心秘密

    ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog (1) 常量的概念 常量顾名思义就是无法改变的量,比如一周有7天,一天有24小时,这些都是无法改变的量。 (2) 常量的分类 整数常量:1,2,3,-1,-2等 小数

    2024年02月19日
    浏览(27)
  • 解密 LLAMA2 代码:揭开语言人工智能惊奇的秘密

    简介 在不断发展的 AI 和自然语言处理领域,深度学习模型的突破推动着机器理解和生成人类语言的能力。在这些杰出的模型中,LLAMA2 Transformer 脱颖而出,成为真正的游戏规则改变者,将语言理解和生成的可能性推向新的高度。 LLAMA2 基于 Transformer 架构,融入了先进技术和架

    2024年02月21日
    浏览(35)
  • 解锁文字魔法:探索自然语言处理的秘密——从技术揭秘到应用实战!

    目录  前言 关键技术——揭密自然语言处理的秘密武器! 领域应用——自然语言处理技术在不同领域的奇妙表演! 超越极限——自然语言处理技术面临的顽强挑战揭秘! 科技VS伦理——自然语言处理技术的发展与伦理社会的纠结较量! 开启应用奇迹!实战自然语言处理技术

    2024年01月19日
    浏览(39)
  • 深究 DevOps 与平台工程的区别

    今天,我们将讨论平台工程和 DevOps 的关系。尽管这两个概念有一些共同点,但它们仍然是截然不同的,我们将具体了解它们之间的区别。本文旨在解释当代软件工程中的这两个基本概念。通过实际案例,我们将分别说明这两个方法如何塑造了软件开发和交付。 了解它们之间

    2024年02月22日
    浏览(27)
  • 【Spring】深究SpringBoot自动装配原理

    早期的 Spring 项目需要添加需要配置繁琐的 xml ,比如 MVC 、事务、数据库连接等繁琐的配置。 Spring Boot 的出现就无需这些繁琐的配置,因为 Spring Boot 基于 约定大于配置 的理念,在项目启动时候,将约定的配置类自动装配到 IOC 容器里。 这些都因为 Spring Boot 有自动装配的特性

    2024年02月14日
    浏览(23)
  • .NET 通过源码深究依赖注入原理

    依赖注入 (DI) 是.NET中一个非常重要的软件设计模式,它可以帮助我们更好地管理和组织组件,提高代码的可读性,扩展性和可测试性。在日常工作中,我们一定遇见过这些问题或者疑惑。 Singleton服务为什么不能依赖Scoped服务? 多个构造函数的选择机制? 源码是如何识别循环

    2024年02月05日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包