首页 > 其他分享 >关于EOF标识符

关于EOF标识符

时间:2024-06-13 20:28:32浏览次数:8  
标签:读取 EOF scanf result printf 标识符 输入 关于

EOF的概念

EOF是C语言中表示文件结束的标志符号,通常被定义为-1,它用于指示已到达文件的末尾或输入流的末尾。

EOF的使用

  • 在输入操作中,EOF常常用于判断是否到达了文件末尾或输入流末尾,以便终止读取操作。例如,在使用scanf函数进行输入时,可以通过将scanf函数的返回值与EOF进行比较来判断是否读取到了文件结束符。
int result = scanf("%d", &n);
if (result == EOF) {

// 文件结束或输入流结束

} else {

// 成功读取输入

}

scanf的返回值:

scanf成功写入多少个数据,返回值就是多少,如果写入失败则返回EOF。

  • 在文件操作中,当使用类似fgetc、fgets、fscanf等函数从文件中读取字符或字符串时,当读取到文件结束符EOF时,这些函数通常会返回EOF。
int ch = fgetc(file);

if (ch == EOF) {

// 文件结束

} else {

// 成功读取字符

}

需要注意的是,EOF并不是一个实际的字符或整数值,而是一个特殊的标志,用于指示文件结束或输入流结束的状态。

在不同的操作系统和编译器中,EOF的值可能会有所不同,但通常都是一个负整数(通常为-1)。因此,将函数的返回值与EOF进行比较,可以跨平台地判断文件结束。

但是在编译器输入操作中,输入无论是输入’-1‘还是输入EOF,其都是当作字符被成功地读入,并不能起到EOF的作用,也就是说while((c = getchar()) != EOF)一直跳不出来,那输入通过什么能写入EOF标志呢?

如何表示输入结束

scanf 函数中,键盘输入 Ctrl+D (在Unix/Linux系统下) 或者 Ctrl+Z (在Windows系统下) 才会被读取到 EOF (End of File),表示输入结束。 EOF 是一个特殊的标记,用于指示输入流的结束。

另外,键盘输入Ctrl+C会强制停止程序的运行

使用EOF的具体情况

  • 遇到多组输入的情况

我们可以看到在这道题目的输入描述中出现多组输入但是并没有告诉我们具体数量,在这个时候我们就需要用到EOF;

#include <stdio.h>

int main() {
    int i;

    while (scanf("%d", &i) != EOF) {

        if (i % 2 == 0) {
            printf("Even\n");
        }
        else {
            printf("Odd\n");
        }
    }

    return 0;
}

但是这段代码会遇到如下两个问题:

  1. 如果连续输入多个数字而不按下回车

  2. 如果输入数字以外的其他字符

分别会出现以下两种情况:

问题分析:

第一个情况涉及到输出缓冲区的概念:

在C语言中很多输出函数(如printf, putchar)便存在输出缓存. 在window系统下,使用printf()函数后,数据被写入到输出缓冲区,随后立即刷新缓冲区,所有我们在使用printf()函数时往往会很快就在控制台打印出来了。

第二个情况输入其他符号(例如~、.)会导致陷入死循环的原因是scanf函数无法成功解析这些非数字字符,并将其保留在输入缓冲区中。

当scanf函数无法成功解析输入时,它会将输入缓冲区中的内容保留,并返回0,表示读取失败。由于输入缓冲区中的内容与%d格式要求不匹配,scanf函数会一直返回0,导致循环无法终止,从而陷入死循环。

解决办法:

读取之后检查scanf的返回值,以判断输入是否成功匹配并读取。

#include <stdio.h>

int main() {
    int i;
    int result;
    while ((result = scanf("%d", &i)) != EOF) {
        if (result == 1) {
            if (i % 2 == 0) {
                printf("Even\n");
            } else {
                printf("Odd\n");
            }
        } else {
            printf("Invalid input\n");
            break;
        }
    }
    return 0;
}

在这个修改后的代码中,我们使用result变量来存储scanf函数的返回值。如果result等于1,表示成功读取了一个整数,并执行相应的逻辑。如果result不等于1,表示输入格式不符合预期,我们输出"Invalid input"并使用break语句跳出循环。

这样修改后,当输入其他非数字字符时,程序会输出"Invalid input",并跳出循环,而不会陷入死循环。

判断输入是否合法

如果输入错误需要重新输入而不是跳出循环的话,可以这样:

while ((result = scanf("%d", &i)) != EOF)
if (result != 1)
        {
            printf("输入不合法,请重新输入!\n");
            while (getchar() != '\n');
            continue;
        }

标签:读取,EOF,scanf,result,printf,标识符,输入,关于
From: https://blog.csdn.net/2302_80970336/article/details/139663413

相关文章

  • Linux时间子系统1:gettimeofday和clock_gettime实现分析
    1.Linux用户态获取时间的函数a.秒级别的时间函数:time和stimetime和stime函数的定义如下:#include<time.h>time_ttime(time_t*t);intstime(time_t*t);        time函数返回了当前时间点到linuxepoch的秒数(内核中timekeeper模块保存了这个值,timekeeper->x......
  • 关于RTthread使用PWM的总结经验(基于STM32F4系列)
    目录硬件资源介绍:前期准备:代码编写:总结:硬件资源介绍:笔者使用的是STM32F407VET6是魔女开发板,因为RT不支持CMSIS-DAP烧录,所以我又准备了一个ST-link,一个红色的LED。我所使用的是TIM2-CH3通道,在我这个板子上对应的是PA2口。原理图如下所示。可以看到PA2上对应的有TIM2_......
  • 关于加密,解密,摘要,编码的理解和应用
    故事的开始那是一个夏天,在杭州,和两位好友吃完饭聊着。他们都是刚刚入行的程序员,讨论着密码在系统中存储的方式MD5.当时的我还是个门外汉,听着他们的讨论,非常有兴趣。那时候我认为MD5是加密放方式(当然现在看来不是)。那时候我认为处理密码的方式是,用户注册后,密码通过MD5加盐方式存入......
  • 关于centos6以下yum源失效的问题
    今天偶尔启动了以下长时间未用的云服务器,使用yum安装某些软件,发现报网络延迟的错误Errorsduringdownloadingmetadataforrepository'docker-ce-stable':-Curlerror(28):Timeoutwasreachedforhttps://download.docker.com/linux/centos/8/x86_64/stable/repodata/......
  • 机器学习python实践——关于ward聚类分层算法的一些个人心得
    最近在利用python跟着参考书进行机器学习相关实践,相关案例用到了ward算法,但是我理论部分用的是周志华老师的《西瓜书》,书上没有写关于ward的相关介绍,所以自己网上查了一堆资料,都很难说清楚ward算法,幸好最后在何晓群老师的《多元统计分析》这本书找到了比较清晰的说法,所以总结出......
  • 关于HTML5的基础学习内容
    HTML5的学习之web的介绍我们重新开始学习了HTML,相当于是开始重新认识这门高级语言,作为一个真正快要步入设计或者程序员的门槛的学习者,现在开始认真的记录每天的学习成果!关于HTML的第一步一、认识HTMLWeb开发        Web开发是指创建和维护网站和应用......
  • 个人关于vuex的见解
    前言vuex是什么?Vuex是Vue.js的官方状态管理库,专为Vue.js应用程序设计,用于在复杂的前端应用中集中管理状态。Vuex的重要性集中管理:统一存储应用状态,简化复杂应用的状态逻辑。响应式更新:状态变更自动反映到所有依赖组件,保持UI与状态同步。预测性:状态变更通过mutatio......
  • 关于CSRF
    CrossSiteRequestForgery跨站请求伪造当用户访问恶意网站时,恶意网站可以通过链接跳转的方式,引导用户访问被攻击网站,因为用户可能最近刚刚访问过被攻击网站,浏览器携带其缓存的合法cookie让用户访问,cookie中保存了客户的认证信息,用户从而不需要重新认证。此过程实际上是恶意......
  • 关于Android切换系统字体大小和字体样式导致App崩溃或者界面错乱的问题
    测试小姐姐测试版本的时候,把系统字体给变大了,再回到app直接崩溃,分析原因找问题,主要有2种方式第一种.设置字体大小我们都是用的是sp,如果改为dp就不会有这个问题,我相信大部分写android的都是用的sp,现在改回来肯定是头痛,别着急,我们先看看源码 publicstaticfloata......
  • 关于autoSSH保持连接的两种方法
    使用ssh端口转发功能进行内网穿透,但是经过的网络稍有不稳定就可能导致连接断开,所以考虑使用工具AutoSSH,按照默认使用还需要一个监听端口,考虑到安全尽量少开端口,是否可以不用,很多文章都提到了可以用ssh自身保持连接的方法,如下面这篇:第21篇:SSH隧道持久化配置-知乎其中......