C语言基础之输入输出

news2025/1/12 4:48:26

前言

本次博客会是最有料的博客了,这其中的问题尤其是scanf函数对新手很不友好

我们本次

1会讲解其他的一些输入输出函数,分析他们的优劣点

2本次的参考资料来自于 c primer plus

1scanf函数详解

首先大家了解过scanf的功能吗

1大家已经学到这里了,肯定知道,scanf是从输入流读取一个指定格式的数据

因为它的格式会变呀,而且它的参数也会变

关于这个参数改变其实涉及到了函数重载问题,以后会提到

1定义

它的参数先不讲,但是它的返回值得有讲头

我们看看他的返回值是个啥

scanf返回成功转换和分配的字段数;返回值不包括已读取但未分配的字段。返回值0表示未分配任何字段。如果在第一次尝试读取字符时遇到文件结尾字符或字符串结尾字符,则返回值为EOF。

那么这里又有一个问题了,scanf函数是如何读取的呢

2scanf函数的读取

接下来的这句话来自于c primer plus

1scanf读取字符

值得注意的是scanf在读取时可以用'\n' 结束

但是我们要让程序进行就必须要使用换行符

看代码

int main() {
    char ch1;
    char ch2;
    scanf("%c%c", &ch1, &ch2);
    printf("%c", ch1);
    printf("%c", ch2);
    return 0;
}

我们假设输入两个字符a 和‘ ’(空格)

看结果

结果就是只有a 空格看不见 此时读取到了两个字符

那么如果只输入一个a呢,当然在实操中还要输入'\n'来使程序继续哦

此时结果是一样的

但是读取到的不一样 scanf只读取到l一个字符

当然有很多人会有疑惑,那么多打印出来的'\n‘去哪里了

多出来的换行符就会出现在缓存区中只要你再次读取一次就不会再让你输入了

而是直接是下一个字符变为换行

看代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
    char ch1;
    char ch2;
    char ch3;
    scanf("%c%c", &ch1, &ch2);
    printf("%c", ch1);
    printf("%c", ch2);
    scanf("%c", &ch3);
    printf("%c", ch3);
    printf("理解了吗?上面有换行哦");
    return 0;
}

我们来看结果

本来要读三次的结果只读了两次,因为第三次直接把缓存区中的‘\n’读出来了

2scanf读取数字

那么读取数字有是怎样的呢

数字不像字符一样,数字有大有小,他可以是连续的

那你说怎样辨别两个不同的数字呢

既然是数字我们分辨不同的数字是使用空格 空行('\n')制表符的

举例

int main() {
    int a;
    int b;
    scanf("%d%d", &a, &b);
    printf("%d %d", a, b);
    return 0;
}

看结果

我们这里是使用空格作为区分数字,也就是一次读取的结束标志

大家可以使用其他的方式来多试几次

3scanf数字与字符混和读取

这个也同样有讲头

我们可以举例

int main() {
    int a;
    float b;
    char ch1;
    char ch2;
    scanf("%d%c%c%f", &a,&ch1,&ch2,&b);
    printf("%d %c %c %f", a,ch1,ch2,b);
	system("pause");
    return 0;
}

看看结果

这个结果是不是很奇怪呀,注意在混合使用scanf读取时一定要注意数字不要和字符通过空格分开

比如这样

是不是这样就不会出错了

当然我们细心的小伙伴发现了吗

代码中的scanf

 scanf("%d%c%c%f", &a,&ch1,&ch2,&b);

它的换位符%d%c%c%f他是不分开的

如果,我们是其分开是不是能够解决问题

直接看结果

看到吗,分开了,也同样没有问题

小总结

你们好幸运,笔者第一次遇到这个问题也是花了好多时间才解决,真的很烦

4scanf函数的读取字符串

这是在读取单词而不是字符串

在读取字符串时以空格 空行('\n')制表符结束,

当然当我们遇到文件结尾字符时可以直接结束

我们首先就得把那EOF文件结尾字符问题解决

我们先来看看EOF

EOF它的值为-1,话不多说直接验证

看代码

这个时候就可以验证了

那么我们怎么使用EOF呢

还是先初步了解一下吧

看代码

int main() {
    int num;
    int result = scanf("%d", &num);

    if (result == EOF) {
        printf("读取失败或已到达文件末尾\n");
    }
    else {
        printf("成功读取到数字:%d\n", num);
    }
	system("pause");
    return 0;
}

注意,本次代码是在vc环境下的

主要不知道为什么vs好像不支持scanf返回EOF

那让我们看看vs的结果

现在还搞不懂为什么

system("pause");是使程序不会一闪而过

要使用<stdlib.h>

我们看看vc结果 测试一番

看到没有当scanf遇到了文件结尾字符就会返回EOF

这是咱么第一次了解了文件结尾字符,以后会用作用name

当然这也同样说明了一件事

那么在告诉ctrl+z为模拟文件结尾字符

不同的编译器对于同一个代码可能会产生不同的结果

那么我们接下来看使用scanf输入字符串

首先

scanf都会从第一个非空白字符作为字符串的开始,以下一个空格 空行('\n')制表符作为结束,

大家看这个表可以看懂吗

如果说

我们后面还要继续输入字符或者字符串的话,j就会从剩余的序列中读入

这个我们前面就已经有过讲解了

还是让大家看看代码吧

大家看明明要读取两次可是只读取了一次

为什么呢

空格为第一次结束标志符

换行为第二次结束标志符

所以第二次scanf 接收的值直接为hup

所以scanf函数在接收字符串时是不能有空格的,这就是它的缺陷

那么还有一个疑问 %5s代表什么

它其实就是限定字符串的大小,如果遇到结束的标志那么即便没有达到长度

也会结束

所以呢,scanf只能接收连续的字符串

2getchar与putchar

他俩是单字符的i/o

我们直接看他们的定义

int getchar(void);

int putchar( int c );

当然他们是预处理的宏定义的代码块

putchar返回所写的字符为了指示错误或文件结束条件返回EOF

getchar返回读取的字符。为了指示读取错误或文件结束条件getchar返回EOF.

那么有了这两个就可以解决scanf不能输入接收空格的问题

他们同样也有结束条件遇到EOF就会结束

遇到'\n'就会把输入的值放入缓存区中,

看代码

我们可以输入一些字符,输出它

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

看结果

注意呀,ctrl+z不能出现在一行的末尾只能再另起一行

那么这样我们就可以使用这两个函数,输入输出带空格的字符串

当然 我们仍然要解释只要getchar不返回EOF那么就会一直输入输出

那么为什么ch是int类型的呢  原因在于EOF的值为-1

原因在于int有更大的范围

ok

再来讲解一个万能的清除缓存区代码

int ch;
while((ch=getchar())!=EOF&&ch!='\n');

这个可以把缓存区清理

3puts gets

char *gets( char *buffer );

如果成功,gets函数中的会返回其参数

也就是数组名

int puts( const char *string );

如果成功,返回一个非负值。如果失败,则返回EOF

作为接收打印字符串的函数

gets是有一定的用途的

他两也有相同的地方

gets读取输入,直到遇到换行符,丢掉换行符加入'\0'

把读到的字符串放入数组中

而puts

就是打印某个字符串

并且会自动在该字符串中加入'\n'

看代码

int main() {
 char a[100];
 gets(a);
 puts(a);
 puts("what can i say");
 puts("黑尼曼");
 system("pause");
    return 0;
}

看结果

是不是验证了

当然我们的数组必须要大于输入的字符串

否则会出现溢出的现象

所以很多编译器不支持gets的使用

从而又有一种输入函数的诞生

get_s(const char * s,int n)

就是比get多了一个整型数,其实就是为了防止越界

是把读取前n个字符防止越界其他与gets一样

最后

我们来给大家总结一波

1 输入输出是存在缓存区的

2回车是输入的结束标志,但本生是一个字符会存入到输入缓存区中

3解决scanf报错,

直接就来 #define _CRT_SECURE_NO_WARNINGS

最后祝大家开心

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1524235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java Swing游戏开发学习11

内容来自RyiSnow视频讲解 这一节讲的是游戏状态GameState 游戏状态这里是&#xff0c;游戏所处的各种状态&#xff0c;比如游戏中、已暂停、与NPC对话中、与怪物Monster战斗中等等。在不同的状态中&#xff0c;游戏的交互也是不同的&#xff0c;比如按Enter键在游戏中状态&…

第三篇 - 概述- IAB受众和技术标准 - IAB视频广告标准《数字视频和有线电视广告格式指南》

第三篇 - 概述- IAB受众和技术标准​​​​​​​ - 我为什么要翻译介绍美国人工智能科技公司IAB技术标准系列&#xff08;2&#xff09; 本文目录 一、IAB技术实验室简介 二、概述及IAB受众 三、资源- IAB倡导的相关视频广告技术标准 四、案例分享-介绍一家数字化营销服务…

每日OJ题_简单多问题dp⑧_力扣188. 买卖股票的最佳时机 IV

目录 力扣188. 买卖股票的最佳时机 IV 状态机分析 解析代码 力扣188. 买卖股票的最佳时机 IV 188. 买卖股票的最佳时机 IV 难度 困难 给你一个整数数组 prices 和一个整数 k &#xff0c;其中 prices[i] 是某支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取…

基于springboot+mybatis调用MySQL存储过程

前言&#xff1a; 很多公司一般不使用JAVA写存储过程&#xff0c;因为写法较为复杂&#xff0c;不方便后期维护。 不排除一些公司项目会使用。 如果索引优化已经达到很好的性能&#xff0c;不建议使用。以下示例供学习参考&#xff1a; demo源码&#xff1a;https://gitee.com…

Mysql的行级锁

MySQL 中锁定粒度最小的一种锁&#xff0c;是 针对索引字段加的锁 &#xff0c;只针对当前操作的行记录进行加锁。 行级锁能大大减少数据库操作的冲突。其加锁粒度最小&#xff0c;并发度高&#xff0c;但加锁的开销也最大&#xff0c;加锁慢&#xff0c;会出现死锁。行级锁和存…

idea 的基本配置

一、安装目录介绍 其中&#xff1a;bin 目录下&#xff1a; 二、配置信息目录结构 这是 IDEA 的各种配置的保存目录。这个设置目录有一个特性&#xff0c;就是你删除掉整个目录之后&#xff0c;重新启动 IntelliJ IDEA 会再自动帮你生成一个全新的默认配置&#xff0c;所以很多…

还看YOLOv8,YOLOv9呢,烂怂卷积有啥好看的?教你利用多模态大模型做目标检测!

文章大纲 大模型业态与idea 来源可行性探索现有成果国内多模态APP 探索利用现有平台进行快速开发 MVP参考文献大模型业态与idea 来源 有一次我在单位汇报的时候,大领导问:深度学习先在还这么落后嘛?每次解决一个问题还要重新训练一个模型࿱

zabbix配置

1 下载zabbix 1 配置yum源 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release- 5.0-1.el7.noarch.rpm yum clean all yum makecache fast 完成后会出现zabbix.repo文件 2安装zabbix服务 yum -y install zabbix-server-mysql zabbix-web-mysql z…

Redis学习笔记(基础篇)

Redis基础 1 Redis是什么&#xff1f;1.1 键值型1.2 NoSQL1.2.1 NoSQL与SQL的区别是什么1.2.2 总结 1.3 Redis的特点是什么&#xff1f; 2 Redis怎么用&#xff1f;2.1 Redis的基本命令2.2 Key的层级结构2.3 Redis的基本数据类型有哪些&#xff1f;2.1.1 String类型2.1.2 Hash类…

一维差分(模板)

差分是前缀和的逆运算&#xff0c;对于一个数组a&#xff0c;其差分数组b的每一项都是a [ i ]和前一项a [ i − 1 ]的差。 注意&#xff1a;差分数组和原数组必须分开存放&#xff01;&#xff01;&#xff01;&#xff01; #include <iostream> using namespace std;t…

【静夜思】为什么我们会如此喜欢夜晚呢

作为一名大学生&#xff0c;熬夜对我来说已是常态。每天都是近乎一点钟才有困意&#xff0c;觉得应该上床睡觉了&#xff0c;即使明天早八&#xff0c;即使明天有很多课。我也观察过身边的朋友&#xff0c;他们中大多数也和我一样&#xff0c;基本都是在12点过后才入睡。当今的…

《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)

1.简介 理想很丰满现实很骨感&#xff0c;在应用selenium实现web自动化时&#xff0c;经常会遇到处理日期控件点击问题&#xff0c;手工很简单&#xff0c;可以一个个点击日期控件选择需要的日期&#xff0c;但自动化执行过程中&#xff0c;完全复制手工这样的操作就有点难了。…

【系统架构师】-第4章-信息安全技术

1、基础知识 五要素&#xff1a; (1)机密性&#xff1a;确保信息不暴露给未授权的实体或进程。 (2)完整性&#xff1a;只有得到允许的人才能修改数据&#xff0c;并且能够判别出数据是否已被篡改。 (3)可用性&#xff1a;得到授权的实体在需要时可访问数据&#xff0c;即攻击…

04:HAL----串口通信UART

目录 前言 一:串口协议 1:通信接口 2:串口通信 3:硬件电路 4:电平标准 5:串口参数及其时序 二:USART介绍 1:简历 2:USART框图 3:USART的基本结构 4:数据帧 5: 波特率发生器 6:数据模式 三:HAL A:HAL库回调 B:配置步骤 四:案例 A:STM32发送数据 B:STM32接收…

mybatis-plus笔记1

mybatis-plus笔记1 mybatis-plus快速入门基于Mapper接口的crud增强基于service的crud分页查询分页添加到自定义方法queryWrapper简单使用使用细节 updateWrapperlambdaWrapper mybatis-plus快速入门 pom.xml文件中导入相关依赖 application.yaml配置文件 MainApplication.java…

2024HVV行动-进军蓝中研判(log4j2、fastjson、Struts2、Shiro)

1、log4j2 特征&#xff1a; 恶意请求中包含 JNDI 协议地址&#xff0c;如"ldap://"、"rmi://"等&#xff0c;被 log4j2 解析为 JNDI 查找。 原理&#xff1a; 在日志输出中&#xff0c;未对字符进行严格的过滤&#xff0c;执行了 JNDI 协议加载的远程恶…

五、保持长期高效的七个法则(二)Rules for Staying Productive Long-Term(1)

For instance - lets say youre a writer.You have a bunch of tasks on your plate for the day, but all of a sudden you get a really good idea for an essay. You should probably start writing now or youll lose your train of thought.What should you do? 举例来说…

7.JavaWebHTML:构建数字世界的语言和结构

目录 导语&#xff1a; 第一部分&#xff1a;Web概念与作用 1.1 Web的定义 1.2 Web的作用 1.3 JavaWeb 第二部分&#xff1a;HTML概念与内容 2.1 HTML的定义 2.2 HTML的内容 第三部分&#xff1a;HTML的作用 3.1 HTML的作用 3.2 HTML在现代Web开发中的角色 …

弗洛伊德-华沙算法求任意两点之间的最短路径算法

对于弗洛伊德-华沙算法首先是要假设研究的图中是不包含有负边的,对于所给的图中的任意亮点v1,vm,假设两点之间存在一条连通路径,对于该路径中去掉头和尾节点,也就是v1,vm,剩下的节点也就称之为这条路径的过渡节点。为图中每个节点进行编号,然后如果图中有n个节点,那么…

WSL的使用记录(1) - 第一次尝试

wsl2下载的话会直接把Ubantu也安装到位&#xff0c;因此我们直接打开Ubantu&#xff0c;在搜索框直接搜索Ubantu&#xff0c;就会出现这个。 我们直接打开就好了。 这时有可能会出现以下文字: wsl: 检测到 localhost 代理配置&#xff0c;但未镜像到 WSL。NAT 模式下的 WSL 不…