【怎么实现多组输入之EOF】

C语言之EOF介绍

1、什么是EOF?

概念

EOF,为end of file的缩写。在C语言中的C标准函数库中表示文件结束符。
EOF通常被定义为-1,表示文件结束符。它用于指示已到达文件的末尾或输入流的末尾。
最普遍地说,它是ASCII码中的替换字符(Control-Z,代码26)

2、EOF的用法

作用

a、C语言中,EOF常被作为文件结束的标志。还有很多文件处理函数处错误后的返回值也是EOF,因此常被用来判断调用一个函数是否成功。
b、在输入操作中,EOF常常用于判断是否到达了文件末尾或输入流末尾,以便终止读取操作。例如,在使用scanf函数进行输入时,可以通过将scanf函数的返回值与EOF进行比较来判断是否读取到了文件结束符。

#include <stdio.h>
int main()
{
    int num = 0;
    int ret = scanf("%d", &num);
    if (ret == EOF)
    {
        printf("EOF");// 文件结束或输入流结束
    }
    else {
        printf("Enter");// 成功读取输入
    }
}

如图所示1
在这里插入图片描述
如图所示2
在这里插入图片描述

注意

a、在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。
b、在文本文件中,数据都是以字符的ASCII代码值的形式存放。
c、我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。

3、EOF的扩展

针对上述内容,我们可以了解一下scanf函数的返回值来帮助我们理解这个EOF

3.1、scanf返回值之EOF

首先先简单看一下关于这节scanf的技术文档:
scanf原型
int scanf( const char *format [,argument]… );

返回值

Return Value

Both scanf and wscanf return the number of fields successfully converted and assigned;
the return value does not include fields that were read but not assigned.
A return value of 0 indicates that no fields were assigned.
The return value is EOF for an error or if the end-of-file character or the end-of-string character is encountered in the first attempt to read a character.

说明

返回值scanf返回成功转换和分配的字段数;返回值不包括已读取但未分配的字段
返回值为0表示没有字段被分配。
如果出现错误,或者第一次尝试读取字符时遇到文件结束字符或字符串结束字符,则返回值为EOF
首先我们scanf函数的返回值用于指示成功读取的参数数量,它可以用于判断输入是否符合预期格式。

3.2、scanf函数的返回值有以下几种情况

a、如果成功读取了所有指定格式的参数,返回成功读取的参数数量。例如,scanf(“%d %f”, &a, &b)成功读取了一个整数和一个浮点数,则返回值为2。
b、如果输入的数据不符合指定的格式,或者无法成功解析为指定的参数类型,则返回值为0。这表示没有成功读取任何参数。
c、如果遇到文件结束符EOF,无法继续读取下一个参数时,返回值为EOF(通常是-1)。这表示达到了文件的末尾或输入流的末尾。

小结
通过检查scanf的返回值,可以根据不同的情况采取相应的处理方式

a、如果返回的值与预期的参数数量相等,表示成功读取了所有参数。
b、如果返回值为0,可能是输入格式不匹配,需要处理输入错误的情况。
c、如果返回值为EOF,可以判断是否到达了文件末尾或输入流末尾。
d、通过检查scanf的返回值,可以根据不同的情况采取相应的处理方式。
e、如果返回的值与预期的参数数量相等,表示成功读取了所有参数。
f、如果返回值为0,可能是输入格式不匹配,需要处理输入错误的情况。
g、如果返回值为EOF,可以判断是否到达了文件末尾或输入流末尾。

总而言之,通过使用EOF和检查scanf函数的返回值,我们可以在输入操作中判断文件结束的状态以及处理输入错误的情况,以确保输入的正确性和完整性。

4、如何是实现多组输入?

4.1、多组输入---- 常规写法例程1

#include <stdio.h>

int main()
{
	int i = 0;
	int arr[10] = { 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//printf("%d\n",sz);
	for (i = 0; i < 5; i++)
	{
		scanf("%d", &arr[i]);//正确输入5次
		//scanf("%d ", &arr[i]);//额外输入一次,6次
		printf("arr[%d] = %d\n",i,arr[i]);
	}
}

这种写法存在一些缺陷,如以下图所示
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4.2、多组输入---- 实现多组输入的打印例程2

备注:待优化

#include <stdio.h>

int main()
{
	printf("请输入一个整数:");
	int num = 0;//num变量---智商
	while (1)
	{
		scanf("%d", &num);
		if (num <= 140)
		{
			printf("智商为:%d\n", num);
		}
		else
		{
			printf("智商大于140,天才:Genius\n");
			//break;
		}
	}
	return 0;
}

如图所示
在这里插入图片描述

备注:优化代码

#include <stdio.h>
int main()
{
	//输入
	int iq = 0;
	//scanf是输入函数
	//scanf()函数的返回值是int类型
	//1.如果读取成功,返回的是实际读取到的数据个数
	//2.如果读取失败,则返回EOF
	//优化一
	//while (scanf("%d", &iq) == 1)
	//{
	//	if (iq >= 140)
	//	{
	//		printf("Genius\n");
	//	}
	//}
	//优化二
	while (scanf("%d", &iq) != EOF)
	{
		if (iq >= 140)
		{
			printf("Genius\n");
		}
	}
	//使用EOF,只要读取成功会一直在while循环里
	//手动输入Ctrl+Z,结束j即可
	return 0;
}

优化一如图所示:
在这里插入图片描述
优化二如图所示:

在这里插入图片描述

4.3、多组输入---- 多组输入经典题例程3

说明
从键盘任意输入一个整数(范围-231~231-1),编程判断它的奇偶性。
多组输入,每行输入包括一个整数。

#include <stdio.h>
int main()
{
	int num = 0;
	while (scanf("%d", &num) == 1)
	{
		if (1 == num % 2)
		{
			printf("Odd\n");
		}
		else
		{
			printf("Even\n");
		}
	}
	//写法二
	//CTRL+Z结束
	while (scanf("%d", &num) != EOF)
	{
		if (1 == num % 2)
		{
			printf("Odd\n");
		}
		else
		{
			printf("Even\n");
		}
	}
	return 0;
}

5、结束语

总体来说;
总而言之,通过使用EOF和检查scanf函数的返回值,我们可以在输入操作中判断文件结束的状态以及处理输入错误的情况,以确保输入的正确性和完整性。
因此,编写程序时应该多熟悉函数使用的细节,并合理地搭配其他语句和特性使用,以便更好地保证程序的正确性、可靠性以及严谨性。

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值