C语言关键字浅析-char

版权声明:本文为博主原创文章,未经博主允许不得转载。 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第五版》

猜你喜欢

转载自blog.csdn.net/Johan_Joe_King/article/details/83684159