字符数组非常特殊,要牢记。
字符数组既可以用一组由花括号括起来、逗号隔开的字符字面值进行初始化。
例如:char my_char1[3] = {'a', 'b', 'c'};//此时my_char1数组的维数是3。
也可以用一个字符串字面值进行初始化,注意字符串字面值包含一个额外的控制符(null)。
例如:char my_char2[4] = "abc";//此时my_char2数组的维数是4。如果写成3就错误了,忘记最后一个非显示null了。
通过以上可以知道字符串字面值的类型是字符常量的数组,即字符串字面值的类型就是const char类型的数组。
C++从C语言继承下来的一种通用结构是C风格字符串,而字符串字面值就是该类型的实例。实际上,C风格字符串既不能确切的归结为
C语言的类型,也不能归结为C++语言的类型,而是以空字符null结束的字符数组。
例如:
char my_char3[] = {'w', 'o', 'r', 'd'}; //不是C风格字符串,只是一个不含有结束符null的字符数组
char my_char4[] = {'w', 'o', 'r', 'd', '\0'}; //C风格字符串
char my_char5[] = "word"; //C风格字符串
const char *my_cp = "word";
char *my_cp1 = my_char3; //指针my_cp1指向my_char3
char *my_cp2 = my_char4; //指向数组第一个元素的指针
可以用(const)char*类型的指针来操纵C风格字符串。
例如:
const char *cp = "some value";
while (*cp) {
//do something to *cp
++cp;
}
while语句的循环条件是对const char*类型的指针cp进行解引用,直到cp指向结束字符数组的null时循环结束
C语言标准库(string.h)提供很多处理C风格字符串的库函数,要使用这些标准库函数必须包含相应的头文件,cstring是string.h的C++版本
#include <cstring>
strlen(s) 返回 s 的长度,不包括字符串结束符 null
strcmp(s1, s2) 比较两个字符串 s1 和 s2 是否相同。若 s1 与 s2 相等,返回 0;若 s1 大于 s2,返回正数;若 s1 小于 s2,则返回负数
strcat(s1, s2) 将字符串 s2 连接到 s1 后,并返回 s1
strcpy(s1, s2) 将 s2 复制给 s1,并返回 s1
strncat(s1, s2,n) 将 s2 的前 n 个字符连接到 s1 后面,并返回 s1
strncpy(s1, s2, n) 将 s2 的前 n 个字符复制给 s1,并返回 s1
注意:传递给这些标准库函数例程的指针必须具有非零值,并且指向以 null 结束的字符数组中的第一个元素。
如果必须使用 C 风格字符串,则使用标准库函数 strncat 和 strncpy 比 strcat 和 strcpy 函数更安全,使用标准库函数 strncat 和 strncpy
的诀窍在于可以适当地控制复制字符的个数。特别是在复制和串连字符串时,一定要时刻记住算上结束符 null。在定义字符串时要切记预留存放 null字符的空间
最后:
应该尽量使用标准库类型的string,对大部分应用而言,使用标准库类型 string,除了增强安全性外,效率也提高了,因此应该尽量避免使用 C 风格字符串。
------------------------------------------
char name[20] = "chenglong";
cout << name; //输出的不是字符数组的首地址,而是整个字符数组
char ch = 'z';
cout << &ch; //输出的不是字符ch的内存地址,而是z字符加上其他东西
------------------------------------------
关于上面的代码,特别的C++为了与C兼容关于字符数组做了特殊处理:
输出字符变量地址的时候,改成输出从这个内存单元开始存放的
一系列字符,到向后遇到第一个'\n'为止。
------------------------------------------
char* name[20];
cin >> name;
------------------------------------------
输入的时候从这个地址开始摆放字符最后再补上'\n'
如果想得到字符变量的地址可以这样:
------------------------------------------
cout << hex << (int)&ch << endl;
------------------------------------------
字符数组既可以用一组由花括号括起来、逗号隔开的字符字面值进行初始化。
例如:char my_char1[3] = {'a', 'b', 'c'};//此时my_char1数组的维数是3。
也可以用一个字符串字面值进行初始化,注意字符串字面值包含一个额外的控制符(null)。
例如:char my_char2[4] = "abc";//此时my_char2数组的维数是4。如果写成3就错误了,忘记最后一个非显示null了。
通过以上可以知道字符串字面值的类型是字符常量的数组,即字符串字面值的类型就是const char类型的数组。
C++从C语言继承下来的一种通用结构是C风格字符串,而字符串字面值就是该类型的实例。实际上,C风格字符串既不能确切的归结为
C语言的类型,也不能归结为C++语言的类型,而是以空字符null结束的字符数组。
例如:
char my_char3[] = {'w', 'o', 'r', 'd'}; //不是C风格字符串,只是一个不含有结束符null的字符数组
char my_char4[] = {'w', 'o', 'r', 'd', '\0'}; //C风格字符串
char my_char5[] = "word"; //C风格字符串
const char *my_cp = "word";
char *my_cp1 = my_char3; //指针my_cp1指向my_char3
char *my_cp2 = my_char4; //指向数组第一个元素的指针
可以用(const)char*类型的指针来操纵C风格字符串。
例如:
const char *cp = "some value";
while (*cp) {
//do something to *cp
++cp;
}
while语句的循环条件是对const char*类型的指针cp进行解引用,直到cp指向结束字符数组的null时循环结束
C语言标准库(string.h)提供很多处理C风格字符串的库函数,要使用这些标准库函数必须包含相应的头文件,cstring是string.h的C++版本
#include <cstring>
strlen(s) 返回 s 的长度,不包括字符串结束符 null
strcmp(s1, s2) 比较两个字符串 s1 和 s2 是否相同。若 s1 与 s2 相等,返回 0;若 s1 大于 s2,返回正数;若 s1 小于 s2,则返回负数
strcat(s1, s2) 将字符串 s2 连接到 s1 后,并返回 s1
strcpy(s1, s2) 将 s2 复制给 s1,并返回 s1
strncat(s1, s2,n) 将 s2 的前 n 个字符连接到 s1 后面,并返回 s1
strncpy(s1, s2, n) 将 s2 的前 n 个字符复制给 s1,并返回 s1
注意:传递给这些标准库函数例程的指针必须具有非零值,并且指向以 null 结束的字符数组中的第一个元素。
如果必须使用 C 风格字符串,则使用标准库函数 strncat 和 strncpy 比 strcat 和 strcpy 函数更安全,使用标准库函数 strncat 和 strncpy
的诀窍在于可以适当地控制复制字符的个数。特别是在复制和串连字符串时,一定要时刻记住算上结束符 null。在定义字符串时要切记预留存放 null字符的空间
最后:
应该尽量使用标准库类型的string,对大部分应用而言,使用标准库类型 string,除了增强安全性外,效率也提高了,因此应该尽量避免使用 C 风格字符串。
------------------------------------------
char name[20] = "chenglong";
cout << name; //输出的不是字符数组的首地址,而是整个字符数组
char ch = 'z';
cout << &ch; //输出的不是字符ch的内存地址,而是z字符加上其他东西
------------------------------------------
关于上面的代码,特别的C++为了与C兼容关于字符数组做了特殊处理:
输出字符变量地址的时候,改成输出从这个内存单元开始存放的
一系列字符,到向后遇到第一个'\n'为止。
------------------------------------------
char* name[20];
cin >> name;
------------------------------------------
输入的时候从这个地址开始摆放字符最后再补上'\n'
如果想得到字符变量的地址可以这样:
------------------------------------------
cout << hex << (int)&ch << endl;
------------------------------------------