赞
踩
字符类型(character)是C语言的几个基本数据类型之一
同时char关键字也算是很常见的
比如程序中常见的:(这也是char变量的定义和初始化格式)
- char c = 't'; // 定义一个字符变量
- char a[10] = "Hello"; // 定义一个字符数组
char的作用是:
定义字符型基本数据类型的变量。
1、char变量的技术实现
说到char类型就不得不提到标准ASCII码,因为从技术实现上看,char字符是由整数解析过来的
所以有些时候可以见到对字符变量进行整型变量类似的处理
- /*
- 将字符类型的数字0-9转化为数值
- */
- int getValue(char n)
- {
- /*
- 由于char可看作整数,且ASCII码中的0-9字符是有序的,
- 所以可以认为编码小于0或者大于9的不是数字,报错
- */
- if(n < '0' || n > '9')
- return -1;
- /*
- 如果是0-9的字符,按照一次等比线性函数关系,
- 把字符编码与0字符的编码相减即得到字符的值
- */
- else
- return n - '0';
- }

当然下面这种直接用数值定义字符变量的做法也是对的,不过不提倡:
- char c = 70; /* 直接用数值编码定义赋值,对ASCII的系统可以,但其他系统中可能出错 */
- char s = 'D'; /* 这样的定义方式更直观,也可以在任意系统中正常工作 */
char变量在printf函数中的说明符是%c,不过因为它本质上是整数表示的,也可以用%d表示:
- char x = 'A';
- printf("Value of %c is %d", x, x); /* Value of A is 65 */
2、转义字符
虽然char字符是表示各种字符符号的,但ASCII中有些字符是不能打印出来的,或者说是一种操作指令,
以及有些字符如果在程序中直接编写可能导致语义冲突(比如引号)
这时候就需要了解一下转义字符了,其常见于字符数组中
- /*
- 输出语句需要引号时需要用'\"'这样的转义字符,否则可能出现语法错误
- 这里用到了引号(\")和回车(\n)的转义字符
- */
- printf("We need a \"YES\"\n");
-
-
- /*
- \t是水平制表符,和Tab键类似
- */
- for(i = 0;i < 3;i++)
- {
- printf("%d\t%d\t%d\n", a[i], b[i], c[i]);
- }
-
-
- /*
- 反斜杠自身也需要反斜杠来加以标注,常用于文件路径的表示
- */
- openFile("H:\\mySoftware\\test.c");

3、char数组
这是个很大的话题,但char数组无疑是很实用和常用的强大字符串处理工具
char数组中还是有很多惊艳的语法形式的
比如ANSI C中支持这样的定义初始化:
- /* 他们都是等价的结果 */
- char a[30] = "I wanna more hair."; /* 简练的赋值 */
- char b[30] = "I" "wanna" "more" "hair."; /* 惊艳的赋值 */
- char c[30]; /* 魔鬼般的赋值 */
- c[0] = 'I';c[1] = ' ';
- c[2] = 'w';c[3] = 'a';c[4] = 'n';c[5] = 'n';c[6] = 'a';c[7] = ' ';
- c[8] = 'm';c[9] = 'o';c[10] = 'r';c[11] = 'e';c[12] = ' ';
- c[13] = 'h';c[14] = 'a';c[15] = 'i';c[16] = 'r';c[17] = '.';c[18] = '\0';
-
- /*
- 注意第二个赋值方式,字符串文字中间没有间隔或者有空格,ANSI C会自动连起来
- 第三个赋值的末尾的\0叫做结束标识符,通常编译器会自行补全
- 比如当前长度为30的c数组,只有前18位元素有字符,则后面的位置会被\0补全
- */
很多时候我们其实并不清楚我们需要操作的字符串长度为多少,不妨把长度计算的工作交给编译器去决定,
庆幸的是C的编译器愿意分担这项工作:
- /* 管他数组多长呢 */
- char c[] = "Messi Neymar Suarez Xavi Iniesta Busquets Alba Pique Maschenaro Alves";
既然char数组本身是数组,那很多数组上的指针的用法在这里也是行得通的
- char barcaForward[10] = "Messi";
- printf("%s\n%c", barcaForward, *barcaForward);
- /*
- 结果是:
- Messi
- M
-
- %s是输出字符数组的说明符,会从字符数组的第一个元素开始输出字符串
- *barcaForward是得到指向的地址中的值,应该是数组的第一个字符
- 即M
- */
——参考《C Primer Plus第五版》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。