C语言基础级——字符与字符串
‘字符’,C语言规定字符用单引号(''
)作为定界符;“字符串”,C语言规定字符用双引号(""
)作为定界符;
字符
字符是C语言最基本的元素,C语言字符集由字母、数字、空白、标点和特殊字符组成的。%c
是字符型占位符。空白字符包括空格符、制表符和换行符。
char str = 'a';
printf("%c\n", str);
我们再用%d
整型占位符,看下结果。
char str = 'a';
printf("%d\n", str);
%c
打印出是 a
字符,%d
打印出是 97
,我们都是打印str
里面所存放的字符,但是结果却不同。这就是通过ASCII
码表与而二进制转换的标准。
'a'
对应ASCII码为 97
,'A'
对应ASCII码为 65
,'4'
对应ASCII码为 52
。ASCII码表只需要记住几个常用的,不需要花太多时间背下来。ASCII码总表
字符数组
想要用多个字符组成一串,这一长串的字符我们称为字符串。
第一种
char str[] = "abc";
printf("%s\n", str);
注意:
- 采用字符数组存放字符串,
%s
能够直接输出数组当中的字符串。 - 字符串结尾处默认添加
'\0'
,'\0'
是空字符,对应ASCII码为0
。
第二种
char str[] = {'a', 'b', 'c', '\0'};
注意:
- 需要我们手动添加
'\0'
以代表字符串终止。 printf
函数是从首地址逐字节寻址,直到遇到'\0'
后,结束寻址。- 若字符串
'\0'
不存在,可能会导致因为没有'\0'
而多输出乱码或字符串。所以养成习惯,要加上'\0'
;
- 若字符串
第三种
char *str = "abc";
指向字符串(abc
)的指针。
注意:
- 字符串结尾处默认添加
'\0'
,'\0'
是空字符,对应ASCII码为0
。
三者区别
内存的存储区域不同,且作用方式、声明周期也有所不同。
- 字符是单引号(
''
),字符串是双引号(""
),如果字符串常量用单引号,会报错。 - 字符存储空间
一
个字节,而字符串存储空间是多
个字节。 - 前两种并不是保存在常量区,从常量区拷贝出字符串的副本存放到数组当中,位于内存的栈区,可修改。
#include<stdio.h>
int main()
{
#if 1
// 打印原来的字符串
char str[] = "hello";
printf("str[] = %s\n", str);
// 打印修改后的字符串
str[0] = 'w';
printf("str[] = %s\n", str);
#endif
#if 0
// 打印原来的字符串
char str_1[] = {'h', 'e', 'l', 'l', 'o', '\0'};
printf("str_1[] = %s\n", str_1);
// 打印修改后的字符串
str_1[0] = 'w';
printf("str_1[] = %s\n", str_1);
#endif
return 0;
}
- 第三种相当于指针里存放着
"abc"
的地址,通过寻址方式找到"abc"
,无法直接通过指针修改常量区,它是只读。一旦修改,就会报段错误。
#include<stdio.h>
int main()
{
// 打印原来的字符串
char *str_2 = "hello";
printf("str_1[] = %s\n", str_2);
// 打印修改后的字符串
str_2[0] = 'w';
printf("str_1[] = %s\n", str_2);
return 0;
}
字面量后缀
定义
实际上字符串更严谨地称为字符串字面量,例如:"hello"
"Home\n"
。
字面量又有很多种,整型字面量、浮点型字面量、字符型字面量…
字面量后面,我们都会增加一个后缀标记类型:
- 长整型字面量,后加一个
l
或L
,例如:1234L
- 八进制前面加
0
,例如:031
- 十六进制前面加
0x
或0X
,例如:0x33
、0X33
- 八进制前面加
- 无符号字面量,后加一个
u
或U
,例如:123U
- 单精度浮点型字面量,后加一个
f
或F
,例如:1.23F
- 不增加后缀的浮点型字面量,都为双精度浮点型字面量。例如:
1.23
作用
- 在我们做数学运算过程当中,为了统一每个运算的数据类型,我们通常都会加上对应的后缀标记类型。
float sum = 2.0F * 3.0F * 4.0F;
如果不加上,会导致计算出来的结果,精度上有误差。