文章目录
22. 字符串
22.1. 字符数组 vs 字符指针 vs 常量字符指针 vs string
- 字符数组 char[]
- 它将常量字符拷贝到自己的内存空间,再进行读写操作。
- 它的大小在编译时确定,且固定大小。
- 字符指针 char*
- 它指向常量字符的内存空间,不能修改字符串。
- 只有为它动态分配内存,才能修改。
- 常量字符指针 const char*
- 指向常量字符的指针,不能修改字符串内容。
- 【注意】 如果是 char* 或 char[] 隐式转换成 const char* ,只是不能通过const char* 去修改,可能存在安全隐患。示例如下。
- string 是C++标准字符串类,封装了字符串的操作和管理。
int main() {
char c1[] = "hello";
c1[0] = 'a';
char* p1 = "hello";
p1[0] = 'a'; //报错,尝试修改常量字符
char* p2 = new char[10];
strcpy(p2, "hello");
p2[0] = 'a';
const char* c = p2; //char* 隐式转换成 const char*
c[0] = 'b'; //报错,尝试修改常量字符
p2[0] = 'b';
cout << c << endl; //输出bello
cout << p2 << endl; //输出bello
delete[] p2;
return 0;
}
22.2. strcpy vs sprintf vs memcpy
- 相同:都可以拷贝。
- 区别
- strcpy是字符串之间的拷贝。
- sprintf是其他数据类型到字符串的转化。
- memcpy是内存块间的拷贝。
- 另外,执行效率,memcpy > strcpy > sprintf。示例如下。
struct Person
{
char name[20];
int age;
};
int main() {
char data[100];
strcpy(data, "hello");
int num = 1234;
sprintf(data, "%d", num);
Person person = { "John",30 };
memcpy(data, &person, sizeof(Person));
return 0;
}
22.3. strlen vs length vs size vs sizeof
- 相同:都是获取大小。
- 区别
- strlen位于头文件 < cstring >,获取const char* 长度,包括 char*,char[],因为它们可以隐式转换成const char*。
- length获取string长度。
- size除了获取string长度,还可以获取容器长度。
- sizeof获取对象或类型大小,以字节为单位。示例如下。
int main() {
const char* ctr = "Hello";
cout << strlen(ctr) << endl; //输出5
cout << sizeof(ctr) << endl; //输出4,在32位环境下,指针占4B
string str = "Hello";
cout << str.length() << endl; //输出5
cout << str.size() << endl; //输出5,length和size对string来说没区别
return 0;
}
22.4. 字符串之间的转换
- string 转 const char*,使用c_str()。
- const char* 转 char[],使用strcpy()。
- string 转 char[],使用strcpy(c_str())。
- const char*,char*, char[] 转 string,直接赋值。
- char*, char[] 转 const char*,隐式转换。
22.5 其他数据类型与字符串之间的转换
- const char* 转 int、long和double,分别使用atoi、atol、atof。
- string 转 int、long、long long、float、double、long double,分别使用stoi、stol、stoll、stof、stod、stold。
- 数值类型 转 string,使用to_string。
22.6 字符串分割
- 使用","分割字符串,示例如下。
int main() {
char str[] = "apple,banana,orange,grape";
char* token = strtok(str, ",");
while (token != nullptr) {
printf("%s\n", token);
token = strtok(NULL, ",");
}
return 0;
}