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码中成立。

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

相关推荐
Ni-Guvara5 分钟前
函数对象笔记
c++·算法
love_and_hope7 分钟前
Pytorch学习--神经网络--搭建小实战(手撕CIFAR 10 model structure)和 Sequential 的使用
人工智能·pytorch·python·深度学习·学习
Chef_Chen10 分钟前
从0开始学习机器学习--Day14--如何优化神经网络的代价函数
神经网络·学习·机器学习
芊寻(嵌入式)19 分钟前
C转C++学习笔记--基础知识摘录总结
开发语言·c++·笔记·学习
一颗松鼠28 分钟前
JavaScript 闭包是什么?简单到看完就理解!
开发语言·前端·javascript·ecmascript
泉崎29 分钟前
11.7比赛总结
数据结构·算法
有梦想的咸鱼_30 分钟前
go实现并发安全hashtable 拉链法
开发语言·golang·哈希算法
你好helloworld30 分钟前
滑动窗口最大值
数据结构·算法·leetcode
海阔天空_201335 分钟前
Python pyautogui库:自动化操作的强大工具
运维·开发语言·python·青少年编程·自动化
天下皆白_唯我独黑43 分钟前
php 使用qrcode制作二维码图片
开发语言·php