版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Johan_Joe_King/article/details/83684159
### C语言关键字浅析系列 ###
### ISO/ANSI C 关键字 ###
字符类型(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第五版》