窄字符类型

字符变量的定义和输出

字符型变量用于存储一个单一字符,在 C 语言中用 char 表示,其中每个字符变量都会占用 1 个字节。在给字符型变量赋值时,需要用一对英文半角格式的单引号(‘ ‘)把字符括起来。因此其存储的值的范围是 0 ~ 255,或者 -128 ~ 127。

字符变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的 ASCII 编码放到变量的存储单元中。char的本质就是一个1字节大小的整型。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char ch = 'a';
  5. printf("sizeof(ch) = %u\n", sizeof(ch));
  6. printf("ch[%%c] = %c\n", ch); //打印字符
  7. printf("ch[%%d] = %d\n", ch); //打印‘a’ ASCII的值
  8. char A = 'A';
  9. char a = 'a';
  10. printf("a = %d\n", a); //97
  11. printf("A = %d\n", A); //65
  12. printf("A = %c\n", 'a' - 32); //小写a转大写A
  13. printf("a = %c\n", 'A' + 32); //大写A转小写a
  14. ch = ' ';
  15. printf("空字符:%d\n", ch); //空字符ASCII的值为32
  16. printf("A = %c\n", 'a' - ' '); //小写a转大写A
  17. printf("a = %c\n", 'A' + ' '); //大写A转小写a
  18. return 0;
  19. }

控制台:

  1. sizeof(ch) = 1
  2. ch[%c] = a
  3. ch[%d] = 97
  4. a = 97
  5. A = 65
  6. A = A
  7. a = a
  8. 空字符:32
  9. A = A
  10. a = a

字符变量的输入

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char ch;
  5. printf("请输入ch的值:");
  6. //不要加“\n”
  7. scanf("%c", &ch);
  8. printf("ch = %c\n", ch); //打印ch的字符
  9. return 0;
  10. }

控制台:

  1. 请输入ch的值:b
  2. ch = b

宽字符类型 wchar_t

大家很快就能发现 char 类型的问题,它能存储的字符实在有限。ASCII 字符集仅仅包含了英语字母以及一些符号,别说中日韩三国的文字,就连希腊字母、法语字母的表示都是个问题。因此,涵盖了几乎所有文字符号以及符号表情的字符集 Unicode 就应运而生了。Unicode 总共包含 111万个字符,显然 char 是无法存下这么多字符的,因此 C 语言当中提供了 wchar_t 这个类型,规定大小不得小于 1B。宽字符在涉及到非英文字符的文本处理时非常有用,目前来看,Windows 上占用 2B,Linux 和 macOS 上占用 4B。

  1. char ch = 'a';
  2. wchar_t z = L'中';
  3. printf("%d %d \n", ch, z);
  1. #include <stdio.h>
  2. #include <limits.h>
  3. int main() {
  4. // 字符集 ASCII 127
  5. char a = 'a'; // 97
  6. char char_1 = '1';// 49
  7. char char_0 = '0';// 48
  8. char i = 0; // \0, NULL
  9. // 字面量 literal
  10. // \n : newline
  11. // \b : backspace
  12. // \r : return
  13. // \t : table
  14. // \' : ' 字符字面量
  15. // \" : " 字符串字面量
  16. char char_1_escape_oct = '\61';
  17. char char_1_escape_hex = '\x31';
  18. char newline = '\n';
  19. printf("char a: %d\n", a);
  20. printf("char 1: %d\n", char_1);
  21. printf("char 'i': %d\n", i);
  22. printf("char 1: %c\n", char_1);
  23. printf("char 1: %c\n", char_1_escape_oct);
  24. printf("char 1: %c\n", char_1_escape_hex);
  25. // Unicode CJK Code point.
  26. // C95
  27. wchar_t zhong = L'中';
  28. wchar_t zhong_hex = L'\u4E2D';
  29. printf("中:%d\n", zhong);
  30. printf("中:%d\n", zhong_hex);
  31. // 字符串
  32. char *string = "中";
  33. return 0;
  34. }