当前位置:   article > 正文

C语言关键字浅析-char_character:xiao

character:xiao

### C语言关键字浅析系列 ###

### ISO/ANSI C 关键字 ###

字符类型(character)是C语言的几个基本数据类型之一

同时char关键字也算是很常见的

比如程序中常见的:(这也是char变量的定义和初始化格式)

  1. char c = 't'; // 定义一个字符变量
  2. char a[10] = "Hello"; // 定义一个字符数组

 

char的作用是:

定义字符型基本数据类型的变量。

 

1、char变量的技术实现

说到char类型就不得不提到标准ASCII码,因为从技术实现上看,char字符是由整数解析过来的

所以有些时候可以见到对字符变量进行整型变量类似的处理

  1. /*
  2. 将字符类型的数字0-9转化为数值
  3. */
  4. int getValue(char n)
  5. {
  6. /*
  7. 由于char可看作整数,且ASCII码中的0-9字符是有序的,
  8. 所以可以认为编码小于0或者大于9的不是数字,报错
  9. */
  10. if(n < '0' || n > '9')
  11. return -1;
  12. /*
  13. 如果是0-9的字符,按照一次等比线性函数关系,
  14. 把字符编码与0字符的编码相减即得到字符的值
  15. */
  16. else
  17. return n - '0';
  18. }

当然下面这种直接用数值定义字符变量的做法也是对的,不过不提倡:

  1. char c = 70; /* 直接用数值编码定义赋值,对ASCII的系统可以,但其他系统中可能出错 */
  2. char s = 'D'; /* 这样的定义方式更直观,也可以在任意系统中正常工作 */

char变量在printf函数中的说明符是%c,不过因为它本质上是整数表示的,也可以用%d表示:

  1. char x = 'A';
  2. printf("Value of %c is %d", x, x); /* Value of A is 65 */

 

2、转义字符

虽然char字符是表示各种字符符号的,但ASCII中有些字符是不能打印出来的,或者说是一种操作指令,

以及有些字符如果在程序中直接编写可能导致语义冲突(比如引号)

这时候就需要了解一下转义字符了,其常见于字符数组

  1. /*
  2. 输出语句需要引号时需要用'\"'这样的转义字符,否则可能出现语法错误
  3. 这里用到了引号(\")和回车(\n)的转义字符
  4. */
  5. printf("We need a \"YES\"\n");
  6. /*
  7. \t是水平制表符,和Tab键类似
  8. */
  9. for(i = 0;i < 3;i++)
  10. {
  11. printf("%d\t%d\t%d\n", a[i], b[i], c[i]);
  12. }
  13. /*
  14. 反斜杠自身也需要反斜杠来加以标注,常用于文件路径的表示
  15. */
  16. openFile("H:\\mySoftware\\test.c");

 

3、char数组

这是个很大的话题,但char数组无疑是很实用和常用的强大字符串处理工具

char数组中还是有很多惊艳的语法形式的

比如ANSI C中支持这样的定义初始化:

  1. /* 他们都是等价的结果 */
  2. char a[30] = "I wanna more hair."; /* 简练的赋值 */
  3. char b[30] = "I" "wanna" "more" "hair."; /* 惊艳的赋值 */
  4. char c[30]; /* 魔鬼般的赋值 */
  5. c[0] = 'I';c[1] = ' ';
  6. c[2] = 'w';c[3] = 'a';c[4] = 'n';c[5] = 'n';c[6] = 'a';c[7] = ' ';
  7. c[8] = 'm';c[9] = 'o';c[10] = 'r';c[11] = 'e';c[12] = ' ';
  8. c[13] = 'h';c[14] = 'a';c[15] = 'i';c[16] = 'r';c[17] = '.';c[18] = '\0';
  9. /*
  10. 注意第二个赋值方式,字符串文字中间没有间隔或者有空格,ANSI C会自动连起来
  11. 第三个赋值的末尾的\0叫做结束标识符,通常编译器会自行补全
  12. 比如当前长度为30的c数组,只有前18位元素有字符,则后面的位置会被\0补全
  13. */

很多时候我们其实并不清楚我们需要操作的字符串长度为多少,不妨把长度计算的工作交给编译器去决定,

庆幸的是C的编译器愿意分担这项工作:

  1. /* 管他数组多长呢 */
  2. char c[] = "Messi Neymar Suarez Xavi Iniesta Busquets Alba Pique Maschenaro Alves";

既然char数组本身是数组,那很多数组上的指针的用法在这里也是行得通的

  1. char barcaForward[10] = "Messi";
  2. printf("%s\n%c", barcaForward, *barcaForward);
  3. /*
  4. 结果是:
  5. Messi
  6. M
  7. %s是输出字符数组的说明符,会从字符数组的第一个元素开始输出字符串
  8. *barcaForward是得到指向的地址中的值,应该是数组的第一个字符
  9. 即M
  10. */

 

——参考《C Primer Plus第五版》

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/913209
推荐阅读
  

闽ICP备14008679号