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.rhkb.cn/news/204936.html

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

相关文章

5.29每日一题(函数有界推取值范围:充分条件)

对数函数和幂函数都趋向无穷的时候&#xff0c;幂函数增长速度远远大于对数函数&#xff08;幂函数的次幂大于0就增长速度就远远大于对数函数&#xff09; 无穷除以0等于无穷

详解原生Spring中的控制反转和依赖注入-构造注入和Set注入

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

王者荣耀游戏制作

1.创建所需要的包 2.创建怪物类 bear package beast;import wangzherogyao.GameFrame;public class Bear extends Beast {public Bear(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("img/bear.jpg");width 85;height 112;setDis(65);}} b…

一文例说嵌入式 C 程序的内聚和耦合

1 - 原理篇 低耦合&#xff0c;是指模块之间尽可能的使其独立存在&#xff0c;模块之间不产生联系不可能&#xff0c;但模块与模块之间的接口应该尽量少而简单。这样&#xff0c;高内聚从整个程序中每一个模块的内部特征角度&#xff0c;低耦合从程序中各个模块之间的关联关系…

uniapp开发App从开发到上架全过程

​ 当我们的APP开发完毕&#xff0c;最终交付的时候&#xff0c;必然要经历的一个环节&#xff0c;就是APP上架&#xff0c;国内APP上架一般为IOS端appstore上架&#xff0c;安卓端应用商店比较多&#xff0c;最常见的应用商店有华为应用商店、小米应用商店、OPPO应用商店、VIV…

IDEA不支持Java8了怎么办?

IDEA不支持Java8了怎么办&#xff1f; 01 异常发生场景 当我准备创建一个springboot项目时&#xff0c;发现Java8没了 02 问题的产生及其原因 查阅了官方文档之后&#xff0c;确认了是Spring Boot 不再支持 Java 8&#xff0c;不是我的问题&#xff0c;这一天终于还是来了 0…

深兰科技多款大模型技术产品登上新闻联播!

11月20日晚&#xff0c;新闻联播报道了2023中国5G工业互联网大会&#xff0c;深兰科技metamind、汉境大型城市智能体空间等大模型技术和产品在众多参展产品中脱颖而出&#xff0c;被重点播报。 2023中国5G工业互联网大会 本届大会由工信部和湖北省人民政府联合主办&#xff0c;…

Kafka 分布式消息系统

文章目录 消息中间件对比Kafka概述kafka安装和配置kafka入门生产者发送消息消费者接收消息 Kafka高可用设计集群备份机制(Replication&#xff09;备份机制(Replication)-同步方式 kafka生产者详解同步发送异步发送参数详解(ack)参数详解(retries)参数详解-消息压缩 kafka消费者…

好用的chatgpt工具用过这个比较快

chatgpthttps://www.askchat.ai?r237422 chatGPT能做什么 1. 对话和聊天&#xff1a;我可以与您进行对话和聊天&#xff0c;回答您的问题、提供信息和建议。 2. 问题回答&#xff1a;无论是关于事实、历史、科学、文化、地理还是其他领域的问题&#xff0c;我都可以尽力回答…

【目标跟踪】光流跟踪(python、c++代码)

文章目录 前言一、代码流程与思路二、python 代码2.1 代码详解2.2 完整代码 三、c 代码四、结果展示 前言 光流利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系&#xff0c;从而计算出相邻帧之间物体的运动信息的一种方法。…

Maven 介绍

文章目录 什么是 maven为什么要选择mavenmaven 仓库什么是maven中央仓库什么是maven本地仓库 idea如何创建出maven项目如何引入第三方库依赖配置国内源 下载 Maven Helper 插件查看各个项目之间的依赖关系 什么是 maven Maven是 Apache 下的一个纯 Java 开发的开源项目&#x…

opencv-直方图

直方图是一种对图像亮度分布的统计表示&#xff0c;它显示了图像中每个灰度级别的像素数量。在OpenCV中&#xff0c;你可以使用cv2.calcHist() 函数计算直方图。 以下是一个简单的示例&#xff0c;演示如何计算和绘制图像的直方图&#xff1a; import cv2 import numpy as np …

超声波眼镜清洗机都有哪些是比较值得入手的?眼镜清洗机推荐

在当今社会&#xff0c;眼镜已经成为了我们日常生活中不可或缺的一部分。然而&#xff0c;眼镜的清洗问题却一直困扰着许多人。眼镜上的污垢和油脂不仅影响其美观&#xff0c;更重要的是可能会对眼睛的健康产生不良影响。因此&#xff0c;我们需要一种高效的眼镜清洗机来帮助我…

无需部署服务器,如何结合内网穿透实现公网访问导航页工具Dashy

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 简介 Dashy 是一个开源的自托管的导航页配置服务&#xff0c;具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起&#xff0c;形成自己的导航…

泛型边界的问题

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 我们花了两篇文章讲述了…

上市公司-绿色专利申请、授权(2000-2022年)

一、数据介绍 数据名称&#xff1a;上市公司-绿色专利申请、授权 数据范围&#xff1a;A股上市公司 数据年份&#xff1a;2000-2022年 数据样本&#xff1a;56167条 数据来源&#xff1a;国家知识产权局、WIPO绿色专利清单 数据整理&#xff1a;自主整理 二、数据用途 数…

开发知识点-ArkTS-鸿蒙开发-Typescript

Typescript IED IED https://developer.harmonyos.com/cn/develop/deveco-studio/#download

医疗影像数据集—CT、X光、骨折、阿尔茨海默病MRI、肺部、肿瘤疾病等图像数据集

最近收集了一大波关于CT、X光等医疗方面的数据集包含骨折、阿尔茨海默病MRI、肺部疾病等类型的医疗影像数据&#xff0c;废话不多说&#xff0c;给大家逐一介绍&#xff01;&#xff01; 1、彩色预处理阿尔茨海默病MRI(磁共振成像)图像数据集 彩色预处理阿尔茨海默病MRI(磁共…

Python爬虫404错误:解决方案总结

在进行网络爬虫开发的过程中&#xff0c;经常会遇到HTTP 404错误&#xff0c;即“Not Found”错误。这种错误通常表示所请求的资源不存在。对于爬虫开发者来说&#xff0c;处理这类错误是至关重要的&#xff0c;因为它们可能会导致爬虫无法正常工作。本文将探讨Python爬虫遇到4…

如何在 Vim 中剪切、复制和粘贴

目录 前言 如何在 Vim 编辑器中复制文本 如何在 Vim 编辑器中剪切文本 如何在 Vim 编辑器中粘贴文本 如何通过选择文本来剪切和复制文本 通过选择文本复制 在 Vim 中选择文本来剪切文本 前言 在本篇 Vim 快速技巧中&#xff0c;你将学习到剪切和复制粘贴的相关知识。 剪…