窄字符类型
字符变量的定义和输出
字符型变量用于存储一个单一字符,在 C 语言中用 char 表示,其中每个字符变量都会占用 1 个字节。在给字符型变量赋值时,需要用一对英文半角格式的单引号(‘ ‘)把字符括起来。因此其存储的值的范围是 0 ~ 255,或者 -128 ~ 127。
字符变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的 ASCII 编码放到变量的存储单元中。char的本质就是一个1字节大小的整型。
#include <stdio.h>int main(){char ch = 'a';printf("sizeof(ch) = %u\n", sizeof(ch));printf("ch[%%c] = %c\n", ch); //打印字符printf("ch[%%d] = %d\n", ch); //打印‘a’ ASCII的值char A = 'A';char a = 'a';printf("a = %d\n", a); //97printf("A = %d\n", A); //65printf("A = %c\n", 'a' - 32); //小写a转大写Aprintf("a = %c\n", 'A' + 32); //大写A转小写ach = ' ';printf("空字符:%d\n", ch); //空字符ASCII的值为32printf("A = %c\n", 'a' - ' '); //小写a转大写Aprintf("a = %c\n", 'A' + ' '); //大写A转小写areturn 0;}
控制台:
sizeof(ch) = 1ch[%c] = ach[%d] = 97a = 97A = 65A = Aa = a空字符:32A = Aa = a
字符变量的输入
#include <stdio.h>int main(){char ch;printf("请输入ch的值:");//不要加“\n”scanf("%c", &ch);printf("ch = %c\n", ch); //打印ch的字符return 0;}
控制台:
请输入ch的值:bch = b
宽字符类型 wchar_t
大家很快就能发现 char 类型的问题,它能存储的字符实在有限。ASCII 字符集仅仅包含了英语字母以及一些符号,别说中日韩三国的文字,就连希腊字母、法语字母的表示都是个问题。因此,涵盖了几乎所有文字符号以及符号表情的字符集 Unicode 就应运而生了。Unicode 总共包含 111万个字符,显然 char 是无法存下这么多字符的,因此 C 语言当中提供了 wchar_t 这个类型,规定大小不得小于 1B。宽字符在涉及到非英文字符的文本处理时非常有用,目前来看,Windows 上占用 2B,Linux 和 macOS 上占用 4B。
char ch = 'a';wchar_t z = L'中';printf("%d %d \n", ch, z);
#include <stdio.h>#include <limits.h>int main() {// 字符集 ASCII 127char a = 'a'; // 97char char_1 = '1';// 49char char_0 = '0';// 48char i = 0; // \0, NULL// 字面量 literal// \n : newline// \b : backspace// \r : return// \t : table// \' : ' 字符字面量// \" : " 字符串字面量char char_1_escape_oct = '\61';char char_1_escape_hex = '\x31';char newline = '\n';printf("char a: %d\n", a);printf("char 1: %d\n", char_1);printf("char 'i': %d\n", i);printf("char 1: %c\n", char_1);printf("char 1: %c\n", char_1_escape_oct);printf("char 1: %c\n", char_1_escape_hex);// Unicode CJK Code point.// C95wchar_t zhong = L'中';wchar_t zhong_hex = L'\u4E2D';printf("中:%d\n", zhong);printf("中:%d\n", zhong_hex);// 字符串char *string = "中";return 0;}
