窄字符类型
字符变量的定义和输出
字符型变量用于存储一个单一字符,在 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); //97
printf("A = %d\n", A); //65
printf("A = %c\n", 'a' - 32); //小写a转大写A
printf("a = %c\n", 'A' + 32); //大写A转小写a
ch = ' ';
printf("空字符:%d\n", ch); //空字符ASCII的值为32
printf("A = %c\n", 'a' - ' '); //小写a转大写A
printf("a = %c\n", 'A' + ' '); //大写A转小写a
return 0;
}
控制台:
sizeof(ch) = 1
ch[%c] = a
ch[%d] = 97
a = 97
A = 65
A = A
a = a
空字符:32
A = A
a = a
字符变量的输入
#include <stdio.h>
int main()
{
char ch;
printf("请输入ch的值:");
//不要加“\n”
scanf("%c", &ch);
printf("ch = %c\n", ch); //打印ch的字符
return 0;
}
控制台:
请输入ch的值:b
ch = 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 127
char a = 'a'; // 97
char char_1 = '1';// 49
char char_0 = '0';// 48
char 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.
// C95
wchar_t zhong = L'中';
wchar_t zhong_hex = L'\u4E2D';
printf("中:%d\n", zhong);
printf("中:%d\n", zhong_hex);
// 字符串
char *string = "中";
return 0;
}