1、定义字符串
C语言本身没有string类型,通常使用char数组来表示字符串。常用的定义字符串的方式有:
char str1[] = {'C', 'h', 'i', 'n', 'a'};
char str2[] = "China";
char* str3 = "China";
-
与Java语言不同,C语言中数组的括号是在变量名的后面。第一条定义字符串的语句等价于Java语言中:
char[] str1 = {'C', 'h', 'i', 'n', 'a'};
-
[]
中可以填入数字,表示char数组的长度。但是,中括号中的数字必须大于等于右边字符串数组的长度。char str1[5] = {'C', 'h', 'i', 'n', 'a'}
,char str1[6] = {'C', 'h', 'i', 'n', 'a'}
, ... ,char str1[100] = {'C', 'h', 'i', 'n', 'a'}
都是合法的。char str2[6] = "China";
,char str2[7] = "China";
, ... ,char str2[100] = "China";
都是合法的。,如果 str2 括号内填写的数字小于 6 就会编译出错,出现数组界限溢出错误。char str2[5] = "China";
2、计算char数组的长度
在Java中,数组是看作对象类型的,数组有通用的属性 length,比如 str1.length
可以获取数组的长度。但是 C 语言可没有这么“友善”,想获取char数组的长度:
char str1[] = {'C', 'h', 'i', 'n', 'a'};
int len = sizeof(str1) / sizeof(char); // 这句话计算字符串数组的长度
printf("%d", len);
-
sizeof
是C语言中保留关键字,用来计算数据类型的“宽度”。用 sizeof 可以获得数据类型或变量在内存中所占的字节数。同样,用 sizeof 也可以获得整个数组在内存中所占的字节数。 -
因为数组中每个元素的类型都是一样的,在内存中所占的字节数都是相同的,所以 总的字节数 除以 一个元素所占的字节数 就是数组的长度。
-
sizeof(char)
表示数据类型 char 在内存中所占的字节数,在C语言中,char占一个字节,所以sizeof(char) == 1
。 -
我这里说的字符串数组的长度,说到底还是数组的长度。
3、字符串必须以 结尾。如果不是,就会出现乱码
char str1[] = { 'C', 'h', 'i', 'n', 'a' };
printf("%s
", str1);
-
上面这段代码在 Windows 上,用 Microsoft Visual Studio 运行时,会输出乱码。如图所示:
-
C语言是一直读取到字节
0
作为字符串的结尾。Java则可以根据数组长度属性length,来读取指定长度的字符串。
-
所以,正确的定义方式应该是
char str1[] = { 'C', 'h', 'i', 'n', 'a', ' '};
,此时字符串数组的长度是 6。char str1[] = { 'C', 'h', 'i', 'n', 'a', 0 };
这样定义也是可以的,但是更推荐前一种。
4、定义一个空的字符串数组
char str0[100] = {0}; // 用这条语句定义一个空的字符串数组
int len0 = sizeof(str0) / sizeof(char);
printf("%d", len0); // 数组长度为100
-
第一条语句就等同于Java中的
char[] str0 = new char[100];
-
第一句语句也可以写成
char str0[100] = {};
,这样写也是正确的。但是,这样写不行,空初始值设定项对于未指定绑定的数组无效!char str0[] = {}
5、计算字符串的长度 strlen
与字符串数组的长度不同,字符串的长度是不把字节0算进去的。strlen
函数可以返回字符串的长度:
size_t strlen(const char* str);
然后来看几个实验:
char str1[] = {'C', 'h', 'i', 'n', 'a'};
char str2[] = "China";
char* str3 = "China";
char str4[] = {'C', 'h', 'i', 'n', 'a', ' '};
printf("%d
", strlen(str1)); // 输出结果为19
printf("%d
", strlen(str2)); // 输出结果为5
printf("%d
", strlen(str3)); // 输出结果为5
printf("%d
", strlen(str4)); // 输出结果为5
- 其中,str1 所表示的字符串因为没有以 ' ' 结尾,所以,
strlen
把内存中一直到