C语言之输入输出和字符(2)

目录

缓冲和重定向

▇缓冲

▇重定向

字符

转义字符

\'和\"……字符'和字符"

字符串字面量的写法

字符常量的写法

 八进制转义字符和十六进制转义字符

字符编码


在看本节之前,请先看下上一章,做到更好地衔接。https://blog.csdn.net/W06164932/article/details/135137651?spm=1001.2014.3001.5501


缓冲和重定向

▇缓冲

在上一节学习的代码中,并不是每读入一个字符就马上输出,而是在按下回车键后一起输出。

C语言的输入输出一般会将读入的字符以及待输出的字符暂时保存在缓存中,当达到下列条件时才进行实际的输入输出操作。

A. 缓存已满(全缓冲)

B. 输入换行符(行缓冲)

C. 立即输出(无缓冲)

▇重定向

如下所示,给定输入输出文件名(假设运行文件名的名称称为list0808)并运行

list0808<输入文件名>输出文件名(回车键)

 输入文件的数据就会复制到输出文件中去,但这并不是由C语言实现的,而是由UNIX和MS-DOS等操作系统的重定向功能来实现的。


字符

C语言中的字符都作为非负整数来处理,所以每一个字符都有与之对应的编码(即整数值)。

但是,即使是同一个字符,在不同的运行环境中编码也会有所不同,具体要看程序运行环境所用的字符编码。

让我们来看下ASCII表,以它为说明:

字符‘g’位于第六列第七排,那么它的字符编码就是十六进制的67,同理字符‘A’的字符编码就是十六进制的41,那么将字符‘0’——字符‘9’分别用十六进制和十进制数来表示,如下:(可不是乘号哦)

字符十六进制数十进制数
‘0’0×3048
‘1’0×3149
’2‘0×3250
……
’9‘0×3957

知道了字符‘0’——‘9’的值,那么stitch语句就可以写成下面这样(请看上一章)

	switch(ch){case 48:cnt[0]++; break;break;case 49:cnt[1]++; break;	break;case 50:cnt[2]++; break;break;/*略*/case '57':cnt[9]++; break;break;}

这样我们就能得出一些规律:数字字符ch的值减去48就是对应数组cnt下表0—9的值,根据这个规律我们可以对这个Switch语句进行更改是它更加简化:

if(ch >= 48 && ch <= 57)cnt[ch - 48]++

但是上面的两个程序有个缺点,就是可移植性低,为什么可移植性低呢?

在谈论这些字符时都是基于ASCII码展开的,但是在别的编码表中字符‘0’的值就不一定是48.

不过幸运的是,C语言的运行环境都遵循下面规则:

数字字符‘0’—‘9’都是递增的,虽然‘0’的值根据字符编码各有不同,但是无论哪种环境,‘5’只会比‘0’大5,即‘5’-‘0’的值一定是5.

任意的字符减去‘0’,都能得到所需要的下标值(这个计算方法还是挺重要的,大家一定要掌握哦!),因此可以将上面的if语句改写如下:

	if(ch >= '0' && ch <= '9')cnt[ch - '0']++;

我们通过下面的程序来看看EOF和各个数字字符的值:

#include<stdio.h>int main()
{int i;printf("EOF = %d\n", EOF);for(i = 0; i < 10; i++)printf("%d = %d\n", i, '0' + i);return 0;
}

转义字符

先找到上面ASCII表中的转义字符那一栏,·位于0x07——0x0D的字符是:\a,\b,\t,\n,\v,\f,\r

其中换行的‘\n’,和表示响铃的‘\a’在前面我们早已学习

(图片来自CSDN @code_流苏)

\'和\"……字符'和字符"

引号'和"的转义字符是\'和\",在字符串字面量以及字符串字符常量中使用时,需要注意下面几点:

字符串字面量的写法

字符"必须使用转移字符\"来表示,因此,表示字符串AB"C的字符串字面量就像写成“AB\"C”

字符'既可以使用'也可以使用\'来表示

字符常量的写法

字符"既可以使用"也可以使用\"来表示

字符'必须使用转义字符\'来表示,表示字符'的字符常量为'\"(不可写作‘'’)

 八进制转义字符和十六进制转义字符

以\开头的八进制转义字符和以\x开头的十六进制转义字符,可以用八进制或十六进制的编码任意表示字符。

前者使用1—3位八进制数,后者使用任意数位的十六进制数来表示字符编码

例如在ASCII码中,数字字符‘1’可以用‘\61’或者‘\x31’来表示,不过这种表示方法会降低程序的可移植性,尽量不要使用。


字符编码

C语言规定:

数字字符‘0’—‘9’的值是递增的,但是不能保证下面成立:

大小和小写的英文字母‘A’,‘B’——‘Z’/‘a’,‘b’——‘z’的值是递增的

例如,在大型机普遍使用的EBCDIC码就不遵循这个规则,但是在ASCII和JIS码中成立。

在以后的学习中,我们会将学习到字符串,字符串数组等……不过临近考试,还要做些准备啊,所要更新速度会稍慢。

 

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

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

相关文章

为啥 1000 == 1000 是 false

今天跟大家聊一个有趣的话题&#xff0c;在Java中两个Integer对象做比较时&#xff0c;会产生意想不到的结果。 例如&#xff1a; Integer a 100; Integer b 100; System.out.println(ab);其运行结果是&#xff1a;true。 而如果改成下面这样&#xff1a; Integer a 100…

【动画图解】一次理清九大排序算法!面试官问到再也不慌!

排序算法 交换排序 冒泡排序快速排序 插入排序 直接插入排序希尔排序 选择排序 简单选择排序堆排序 归并排序基数排序桶排序 一、冒泡排序 冒泡排序是一种简单的交换排序算法&#xff0c;以升序排序为例&#xff0c;其核心思想是&#xff1a; 从第一个元素开始&#xff0c…

.NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式

之前写过使用自定义返回类的方式来统一接口数据返回格式&#xff0c;.Net Core webapi RestFul 统一接口数据返回格式-CSDN博客 但是这存在一个问题&#xff0c;不是所有接口会按照定义的数据格式返回&#xff0c;除非每个接口都返回我们自定义的类&#xff0c;这种实现起来不…

解决IDEA编译/启动报错:Abnormal build process termination

报错信息 报错信息如下&#xff1a; Abnormal build process termination: "D:\Software\Java\jdk\bin\java" -Xmx3048m -Djava.awt.headlesstrue -Djava.endorsed.dirs\"\" -Djdt.compiler.useSingleThreadtrue -Dpreload.project.path………………很纳…

Valentina Studio Pro for Mac:高效数据库管理工具

作为一款强大而高效的数据库管理工具&#xff0c;Valentina Studio Pro for Mac在Mac平台上的表现无疑是令人印象深刻的。无论您是初学者还是专业数据库管理员&#xff0c;Valentina Studio Pro都能够满足您的需要&#xff0c;并提供一流的工具和功能来简化数据库管理的过程。 …

linux静态ip配置方法(vmware虚拟机)

1、背景 自己搭建了一个虚拟机&#xff0c;vmware虚拟机&#xff0c;如果使用动态ip,经常变换地址&#xff0c;登录不方便。 优点&#xff1a; 静态网络配置的好处是该服务器地址是静态ip的&#xff0c;不会随着网络更换而出现波动。 2、配置方法 2.1 进入centos系统&#…

HarmonyOS 应用事件打点开发指导

简介 传统的日志系统里汇聚了整个设备上所有程序运行的过程流水日志&#xff0c;难以识别其中的关键信息。因此&#xff0c;应用开发者需要一种数据打点机制&#xff0c;用来评估如访问数、日活、用户操作习惯以及影响用户使用的关键因素等关键信息。 HiAppEvent 是在系统层面…

C++之深拷贝和浅拷贝

目录 浅拷贝 深拷贝 赋值运算符重载的深拷贝 在学习C类和对象时我们学习了浅拷贝&#xff0c;本期我们将再次回顾浅拷贝并为大家讲述深拷贝的概念。 浅拷贝 在学习类和对象时我们学习了拷贝构造函数的概念&#xff0c;而且我们也知道&#xff0c;因为拷贝构造函数属于类的默…

用 树莓派 做成巨型的 Game Boy 你见过吗?

​几年前&#xff0c;华纳斯科奇&#xff08;Warner Skoch&#xff09;萌生了3D打印巨型Game Boy想法。他最初的计划是把它挂在墙上&#xff0c;用一个时钟作为屏幕&#xff0c;就像一件艺术品一样。后来&#xff0c;他的工匠头脑开始活跃起来&#xff0c;开始考虑通过添加 Ras…

3_js数组与函数的应用

1. 数组的应用 1.1 数组的概念 在计算机科学中&#xff0c;数组数据结构&#xff08;英语&#xff1a;array data structure&#xff09;&#xff0c;简称数组&#xff08;英语&#xff1a;Array&#xff09;&#xff0c;是由相同类型的元素&#xff08;element&#xff09;的…

MySQL undo日志精讲2-undo日志写入

通用链表结构 在写入undo日志的过程中会使用到多个链表&#xff0c;很多链表都有同样的节点结构&#xff0c;如图所示&#xff1a; 在某个表空间内&#xff0c;我们可以通过一个页的页号和在页内的偏移量来唯一定位一个节点的位置&#xff0c;这两个信息也就相当于指向这个节点…

基于Java+Swing实现大鱼吃小鱼小游戏(含用户登陆、注册功能)

基于JavaSwing实现大鱼吃小鱼小游戏 一、系统实现二、功能展示1.效果演示2.游戏界面3.游戏运行界面4.用户登陆 三、其他系统四源码下载 一、系统实现 1、创建窗口对象Ui 2、背景的绘制 3、键盘的监听事件 4、将己方鱼放上去 5、让小鱼移动 6、其他的鱼并引导&#xff08;先创建…