1.5 C语言之字符输入输出

1.5 C语言之字符输入输出

  • 一、概述
  • 二、字符计数
  • 三、行计数
  • 四、单词计数
  • 五、练习

一、概述

字符文本流,是由多行字符构成的字符序列,而每行字符都由0个或多个字符组成,行末是一个换行符。
标准库提供的输入输出模型,用于读取文本内容到内存中(输入),将内存中的字符写入文件中(输出)
标准库提供了一次读写一个字符的功能,getchar(), putchar()

#include <stdio.h>
main()
{char c = getchar(); // 从文本流中读入下一个输入字符(从键盘输入),并将其结果值返回putchar(c); // 打印变量c
}

在这里插入图片描述
利用getchar和putchar写一个简单的例子:输入一个字符,将它复制到输出,循环往复,直到文件结束符(EOF)退出
基本思路:
输入一个字符
while(输入的字符不是文件结束符)
输出刚输入的字符
输入下一个字符

#include <stdio.h>
/*把输入复制到输出
*/
main()
{int c;while ((c = getchar()) != EOF){putchar(c);}
}

关系运算符!=表示不等于
C语言中,在没有输入时,getchar将返回一个特殊值,这个特殊值与任何实际字符都不同,这个字符就是EOF(end of file),表示文字流(stream)的结尾。这里的文字流,可以是文件(file),也可以是标准输入(stdin)。EOF不是特殊字符,而是一个定义在头文件stdio.h的常量,一般等于-1。在windows下输入EOF需要输入CTRL+Z,在UNIX系统下输入EOF需要输入CTRL+D

二、字符计数

编写一个程序,统计总共输入了多少个字符

#include <stdio.h>
main()
{long count = 0;while (getchar() != EOF){// ++ 执行加1操作,等同于 count = count + 1++count;}printf("%ld\n", count);
}

练习:使用for改写上面的程序

#include <stdio.h>
main()
{long count = 0;for (;getchar() != EOF; ++count);// 注意这个分号必须得加,表示for的循环体语句printf("%ld\n", count);
}

三、行计数

编写一个程序,统计总共输入了多少行字符

#include <stdio.h>
main()
{int count=0, c;while ((c = getchar()) != EOF){// = 赋值,== 等于, '\n' 表示换行if (c == '\n'){++count;}}printf("%d\n", count);
}

需要注意的是,单引号中字符表示一个整型值,该值等于此字符在机器字符集中对应的数值,我们称之为字符常量。它只不过是小整型数的一种写法,比如,‘A’ 是一个字符常量:在ASCII字符集中其值为65,当然,用’A’比用65更具有表达性,且与具体的字符集无关。
在这里插入图片描述

	printf("%c\n", 'A');printf("%c\n", 'a');printf("%d\n", 'A');printf("%d\n", 'a');

练习:使用for改写上面的程序

#include <stdio.h>
main()
{int count=0, c;for(;(c=getchar())!=EOF;){if (c == '\n'){++count;}}printf("%d\n", count);
}

四、单词计数

#include <stdio.h>
#define OUT_WORD 1 // 不在单词中,遇到空格、换行符、制表符,state设置成 OUT_WORD
#define IN_WORD 0  // 在单词中,遇到单词的第一个字符时,state设置成 IN_WORD,并进行单词计数// 编写一个程序,统计输入行数(lines)、单词数(words)、字符数(charactors)
// 这里假定单词中不包含空格、换行符、制表符
main()
{int c, nl, nw, nc, state;state = OUT_WORD; // 初始值,不在单词中nl = nw = nc = 0; // 连续赋值,从右至左while ((c = getchar()) != EOF){++nc; // 字符数if (c == '\n')++nl; // 行数// || 代表逻辑或,&&代表逻辑与,两个都是短路运算符,比如// a||b 当a条件为真,则整个表达式结果为真,则不再执行条件b// a&&b 当a条件为假,则整个表达式结果为假,则不再执行条件bif (c == ' ' || c == '\n' || c == '\t') state = OUT_WORD;else if (state == OUT_WORD) {state = IN_WORD;++nw; // 单词数}}printf("行数:%d, 单词数:%d, 字符数:%d", nl, nw, nc);
}

五、练习

  1. 验证 getchar() != EOF 的值是0还是1
#include <stdio.h>
main()
{// 输入CTRL+Z, 0// 输入其他字符, 1printf("%d", getchar() != EOF);
}
  1. 编写一个打印EOF值的程序
#include <stdio.h>
main()
{printf("%d", EOF);
}
  1. 编写一个统计空格、制表符、换行符个数的程序
#include <stdio.h>
// 统计空格、制表符、换行符个数
main()
{long sc, tc, nc, c;sc = 0;tc = 0;nc = 0;while ((c = getchar()) != EOF){if (c == ' ')++sc;if (c == '\t')++tc;if (c == '\n')++nc;}printf("%ld, %ld, %ld\n", sc, tc, nc);
}
  1. 编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替
#include <stdio.h>// 编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替
// 关键思路:如何将连续的多个空格用一个空格代替?
// 假如有3个空格,那么只打印第1个即可,后面的2个空格全部舍弃
// 那么如果当前字符是空格的话,就得判断前面的字符是不是空格,如果是空格,当前空格舍弃;如果不是空格,说明不是连续空格,打印当前空格
// 那么既然可以只打印第1个,理论上当然也可以只打印最后1个空格
main()
{int c;// 上一个字符int lc = 's'; while ((c = getchar()) != EOF){if(c != ' ')putchar(c);// 如果上一个字符是空格,丢弃当前空格;如果上一个字符不为空格,那么输出当前空格if(c == ' ')if(lc != ' ')putchar(c);lc = c;}
}
#include <stdio.h>// 编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替
// 那么既然可以只打印第1个,理论上当然也可以只打印最后1个空格
// 如果只打印第最后1个空格,什么时候打印呢,当它后面的字符不是空格时,打印
main()
{// 当前输入字符int c;// 上一个字符int lc = 's';while ((c = getchar()) != EOF){if (c != ' '){if (lc == ' '){putchar(lc);}putchar(c);}lc = c;}
}

那么如果我不选择第1个和最后1个,可以吗?假定有n(0~n-1)个空格,从中选出1个,那么第1个和最后1个永远是最简单的情况
如果要从1~n-2中选一个打印,那么选吧,选哪一个呢,理论上当然也是可以的,只不过编码起来有些冗余。我不再做过多挣扎

  1. 编写一个将输入复制到输出的程序,并将其中的制表符替换成\t,把回车符替换为\b,把反斜杠替换为\。这样可以将制表符和回退符以可见的方式显示出来
#include <stdio.h>// 编写一个将输入复制到输出的程序,
// 并将其中的制表符替换成\t,把回车符替换为\b,把反斜杠替换为\\。这样可以将制表符和回退符以可见的方式显示出来
main()
{// 当前输入字符int c;while ((c = getchar()) != EOF){if (c == '\t')printf("\\t");else if (c == '\b')  // 存疑,回退符如何输入printf("\\b");else if (c == '\\')printf("\\\\");else putchar(c);}
}
  1. 你准备如何测试单词计数程序?如果程序中存在错误,那么什么样的输入最有可能发现这类错误呢?
  • 常规测试,输入字符中包含单词、空格、制表符、回车进行测试
  • 边界条件最容易发现错误:比如
    • 没有输入
    • 没有单词,只有换行符
    • 没有单词,只有空格、制表符、换行符
    • 每个单词各占一行
    • 单词位于行首
    • 单词位于一串空格之后的情况
  1. 编写一个程序,以每行一个单词的形式打印其输入
#include <stdio.h>
#define OUT_WORD 1 // 不在单词中,遇到空格、换行符、制表符,state设置成 OUT_WORD
#define IN_WORD 0  // 在单词中,遇到单词的第一个字符时,state设置成 IN_WORD//  编写一个程序,以每行一个单词的形式打印其输入
main()
{int c, state;state = OUT_WORD; // 初始值,不在单词中while ((c = getchar()) != EOF){if (c == ' ' || c == '\n' || c == '\t') {if (state == IN_WORD) {state = OUT_WORD;putchar('\n'); // 单词结束}} else if (state == OUT_WORD) {state = IN_WORD;putchar(c); // 单词开始} else putchar(c); // 单词除了首尾字符之外的其他字符}
}

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

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

相关文章

前端vue3——html2canvas给网站截图生成宣传海报

文章目录 ⭐前言⭐选择html2canvas实现网页截图&#x1f496; 截图 ⭐图片url截图显示不出来问题&#x1f496; 解决 ⭐最终效果&#x1f496; 定义海报 ⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端vue3——html2canvas给网站截图生成宣传…

JVM字节码文件的相关概述解读

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 1、字节码文件 从下面这个图就可以看出&#xff0c;字节码文件是可以跨平台使用的 想要让一个Java程序正确地运行在JVM中&#xff0c;Java源码就必须要被编译为符合JVM规范的字节码。 https://docs.oracle.com/java…

3. 深入探究文件 IO

3. 深入探究文件 IO 1. Linux 系统如何管理文件1.1 静态文件与inode1.2 文件打开时的状态 2. 返回错误处理与errno2.1 strerror 函数2.2 perror 函数 3. 空洞文件4. O_APPEND 和 O_TRUNC5. 多次打开同一个文件6. 复制文件描述符6.1 dup6.2 dup2 7. 文件共享7.1 同一个进程中多次…

Python 测试框架 Pytest 的入门

简介 pytest 是一个功能强大而易于使用的 Python 测试框架。它提供了简单的语法和灵活的功能&#xff0c;用于编写和组织测试代码。 1、简单易用&#xff1a;pytest 的语法简洁明了&#xff0c;使得编写测试用例更加直观和易于理解。它使用 assert 语句来验证预期结果&#x…

从0到0.01入门 Webpack| 005.精选 Webpack面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

【蓝桥杯】刷题

刷题网站 记录总结刷题过程中遇到的一些问题 1、最大公约数与最小公倍数 a,bmap(int,input().split())sa*bwhile a%b:a,bb,a%bprint(b,s//b)2.迭代法求平方根(题号1021) #include<stdio.h> #include<math.h> int main() {double x11.0,x2;int a;scanf("%d&…

【RTP】RTPSenderAudio::SendAudio

RTPSenderAudio 可以将一个opus帧封装为rtp包进行发送,以下是其过程:RTPSenderAudio::SendAudio :只需要提供payload部分 创建RtpPacketToSend 并写入各个部分 填充payload部分 sender 本身分配全session唯一的twcc序号 if (!rtp_sender_->

时间序列预测实战(十九)魔改Informer模型进行滚动长期预测(科研版本)

论文地址->Informer论文地址PDF点击即可阅读 代码地址-> 论文官方代码地址点击即可跳转下载GIthub链接 个人魔改版本地址-> 文章末尾 一、本文介绍 在之前的文章中我们已经讲过Informer模型了&#xff0c;但是呢官方的预测功能开发的很简陋只能设定固定长度去预测未…

Git控制指令

git status查看当前本地分支的修改状态 git diff 文件路径 查看具体文件的修改内容 git log打印用户信息 git remote -v查看远程地址 git checkout -- *还原被删除的文件 git rm -r --force .删除本地所有文件 git commit -m "Remove all files from repositor…

Xilinx Zynq-7000系列FPGA实现视频拼接显示,提供两套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐FPGA图像处理方案FPGA视频拼接叠加融合方案推荐 3、设计思路详解Video Mixer介绍 4、工程代码1&#xff1a;2路视频拼接 HDMI 输出PL 端 FPGA 逻辑设计PS 端 SDK 软件设计 5、工程代码2&#xff1a;4路视频拼接 HDMI 输出PL 端 FPGA 逻辑设…

BER编码规则

文章目录 一、BER 编码规则介绍二、BER编码数据组成三、Identifier octets Type1. tag class 分类2. p/c 分类3 tag type4. ASN.1的原始数据类型&#xff08;TAG&#xff09; 四、 Length octets1、定长的短格式2、不定长格式3、保留格式 五、Contents octets六 、BER编码番外 …

【数据库篇】关系模式的表示——(2)规范化

范式&#xff1a;范式是符合某一种级别的关系模式的集合 规范化&#xff1a;是指一个低一级的范式的关系模式&#xff0c;通过模式的分解转换为若干个高一级范式的关系模式的集合。 1NF 每个分量必须是不可分开的数据项&#xff0c;满足这个条件的关系模式就是1NF。 2NF 若…

信息检索指标直接优化的通用近似框架

1、直接优化信息检索指标的背景 1.1、存在问题 直接优化信息检索的指标是信息检索的一大方向。主要包含两类方法&#xff0c;一类是将IR指标作为上界进行优化&#xff1b;另一类是使用平滑函数近似表示IR指标进行优化。 直接优化IR指标方式很自然&#xff0c;但没有提供理论…

【Unity】接入MAX聚合广告SDK Applovin + GoogleAdmob

版本&#xff1a; Unity&#xff1a;2019.4.35f1gradle plugin: 4.2.0 &#xff08;实际要7.0 对应build_tools:34.0.0) gradle: 6.7.1 &#xff08;实际要7.0 对应build_tools:34.0.0) jdk: 1.8.0_241build_tools: 34.0.0 ndk: android-ndk-r19 文档&#xff1a; 6.0.1(Andro…

基于springboot+Web实现社区医院管理服务系统项目【项目源码+论文说明】计算机毕业设计

基于springbootWeb实现社区医院管理服务系统演示 摘要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括社区医院管理服务系统的网络应用&#xff0c;在外国线上管理系统已经是很普遍的方式&#xff0c;不过国内的管理系统可…

Redis分片集群

文章目录 Redis分片集群搭建分片集群散列插槽插槽原理小结 集群伸缩需求分析创建新的redis实例添加新节点到redis转移插槽 故障转移自动故障转移手动故障转移 RedisTemplate访问分片集群 Redis分片集群 搭建分片集群 主从和哨兵可以解决高可用、高并发读的问题。但是依然有两…

KT404A远程更换语音芯片方案支持OTA 4G 蓝牙 wifi 物联网

目录 一、简介 2.1 芯片的硬件 2.2 测试的方法 一、简介 KT404A远程更换语音芯片方案支持OTA 4G 蓝牙 wifi 物联网 在线下载的mp3语音芯片ic&#xff0c;通过KT404A的uart直接更换内部的语音文件&#xff0c;从而实现动态的更新语音内容 物联网大潮的来袭。随着智能家居、…

3.2 CPU的自动化

CPU的自动化 改造1-使用2进制导线改造2根据整体流程开始改造指令分析指令MOV_A的开关2进制表格手动时钟gif自动时钟gif 根据之前的CPU内部结构改造,制造一个cpu控制单元 改造一 之前的CPU全由手动开关自己控制,极度繁琐,而开关能跟二进制一一对应, 开:1, 关:0图1是之前的, …

【网络】DNS协议、ICMP协议、NAT技术

DNS协议、ICMP协议、NAT技术 一、DNS协议1、产生背景2、域名简介3、域名解析的工作流程4、使用dig工具分析DNS过程 二、ICMP协议1、ICMP介绍2、ICMP协议格式3、ping命令4、traceroute命令 三、NAT技术1、NAT技术背景2、NAT IP转换过程3、地址转换表4、NAPT技术5、重新理解路由器…

2023年亚太杯数学建模A题——深度学习苹果图像识别(思路+模型+代码+成品)

Image Recognition for Fruit-Picking Robots 水果采摘机器人的图像识别功能 问题 1&#xff1a;计数苹果 根据附件 1 中提供的可收获苹果的图像数据集&#xff0c;提取图像特征&#xff0c;建立数学模型&#xff0c;计算每幅图像中的苹果数量&#xff0c;并绘制附件 1 中所有…