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×30 | 48 |
| '1' | 0×31 | 49 |
| '2' | 0×32 | 50 |
| ...... | | |
| '9' | 0×39 | 57 |

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

cpp 复制代码
	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语句进行更改是它更加简化:

cpp 复制代码
if(ch >= 48 && ch <= 57)
	cnt[ch - 48]++

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

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

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

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

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

cpp 复制代码
	if(ch >= '0' && ch <= '9')
		cnt[ch - '0']++;

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

cpp 复制代码
#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码中成立。

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

相关推荐
hnjzsyjyj39 分钟前
“高精度算法”思想 → 大数阶乘
数据结构·高精度算法·大数阶乘
白宇横流学长1 小时前
基于java出租车计价器设计与实现【源码+文档+部署讲解】
java·开发语言
灰太狼不爱写代码2 小时前
CUDA11.4版本的Pytorch下载
人工智能·pytorch·笔记·python·学习
佳心饼干-2 小时前
C语言-09内存管理
c语言·算法
物联网牛七七2 小时前
4、数据结构与算法解析(C语言版)--栈
c语言·栈操作
dbln2 小时前
贪心算法(三)
算法·贪心算法
数据小爬虫@3 小时前
Java爬虫实战:深度解析Lazada商品详情
java·开发语言
songroom3 小时前
Rust: offset祼指针操作
开发语言·算法·rust
code04号3 小时前
C++练习:图论的两种遍历方式
开发语言·c++·图论
煤泥做不到的!4 小时前
挑战一个月基本掌握C++(第十一天)进阶文件,异常处理,动态内存
开发语言·c++