IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c语言---getchar( ),scanf( ),putchar( )读取数据的原理,EOF的意义和用法 -> 正文阅读

[C++知识库]c语言---getchar( ),scanf( ),putchar( )读取数据的原理,EOF的意义和用法

目录

一、getchar函数的说明

二、读取数据的原理以及解决办法

?1.获取数据

?2.错误的程序

?3.不完美的解决办法

?4.完美的解决办法

三、EOF的意义及用法

1.while()里面的EOF

2.scanf()里面的EOF


一、getchar函数的说明

这里面注意几个点:

1.getchar的类型是int,scanf和putchar的类型也是int。所以我们在使用这几个函数的时候,尤其是getchar和putchar不能想当然的继续定义char类型,应该定义为int类型。

int main()
{
	int ch = getchar();//'a'
	putchar(ch);
	return 0;
}

2.当输入错误的时候会给getchar(scanf、putchar)返回一个EOF。EOF具体是什么放在后面再具体去说。

二、读取数据的原理以及解决办法

1.获取数据

????????首先scanf、getchar是从缓冲区来获取数据的,而缓冲区的数据就是我们键盘所输入的东西。那么他们获取数据结束的标志是什么呢?

????????答案是:\0。就是因为这个\0,我们的问题就来了。

2.错误的程序

先分析大家经常会写的错误程序。

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

????????在这个程序里面当我们在键盘输入123456作为密码的时候,缓冲区就有了这六个数字,而且还会在后面加一个\0。然后scanf就会获取123456作为密码,但是问题就出现了,后面的那个\0就会被下面的ch=getchar()所获取,而不是去获取我们再自己输入的那个Y或N。因此,这个程序的输出结果无论怎么都是确认失败

?3.不完美的解决办法

????????前面存在的问题就是ch=getchar()会把我们的\0直接读取,那么解决这个问题的关键就是处理掉这个\0。所以我们可以通过getchar()来把这个\0存储掉。

int main()
{
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);//123456

	getchar();    //处理\n

	printf("请确认密码(Y/N):>");
	int ch = getchar();
	if ('Y' == ch)
		printf("确认成功\n");
	else
		printf("确认失败\n");
	return 0;
}

? ? ? ? 但是,这个只可以解决一部分的程序问题,万一输入的密码是:123456? ?abc的时候就不行了。getchar只会把密码中间的那个空格吸收掉,abc后面的\0还是不能处理。具体的读取过程就是:scanf先把123456读取了作为密码(这个时候已经错误了)。然后getchar把中间的那个空格读取了,最后下面的那个ch=getchar()会把后面的abc\0读取了,结果导致这个程序根本不用你确认Y还是N,自动就会输出确认失败。因此,这个解决办法还是不能完全解决问题。

?4.完美的解决办法

既然一个getchar()不能解决的问题,就多来几个getchar()。这里就用到了循环。

?? ?int tmp = 0;
?? ?while ((tmp = getchar()) != '\n')
?? ?{
?? ??? ?; ? ?//解决办法
?? ?}

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

三、EOF的意义及用法

????????EOF,为End Of File的缩写,通常在文本的最后存在此字符表示资料结束。最普遍地说,它是ASCII码中的替换字符(Control-Z,代码26)。
在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127不可能出现-1,因此可以用EOF作为文件结束标志

1.while()里面的EOF

#include <stdio.h>
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		putchar(ch);
	}
    return 0;
}

????????当上面的程序运行时,如果不加" != EOF",那么这个程序就是个死循环,会一直运行下去;加上" != EOF"后该程序就不是死循环了,如果在终端不进行输入该程序会自动结束。

????????那么上面那个程序怎么结束呢?

需要注意的是:在终端(黑框)中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾”,因此需要用<Ctrl + z>组合键然后按 Enter 键的方式来告诉系统已经到了EOF,这样系统才会结束。

2.scanf()里面的EOF

#include <stdio.h>
int main()
{
	int ch = 0;
	while (scanf("%d", &ch) != EOF)
	{
		printf("%d ", ch);
	}
	return 0;
}

????????在这"scanf("%d",&n) != EOF"相当于"scanf("%d",&n) != EOF",或"~scanf("%d",&n)",或"scanf("%d",&n) == 1 " 。(scanf的返回值由后面的参数决定)

scanf("%d%d", &a, &b);

如果a和b都被成功读入,那么scanf的返回值就是2;如果只有a被成功读入,返回值为1;如果a和b都未被成功读入,返回值为0;如果遇到错误或遇到end of file,返回值为EOF,且返回值为int型。

完结!
?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-16 12:51:59  更:2022-01-16 12:52:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:12:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码