1 2 3 4 5 6 7 8 9
| char s1[] = "hello"; // sizeof(s1)=6 (包含'\0') char* s2 = "world"; // sizeof(s2)=8 (指针大小) char s3[10] = ""; // sizeof(s3)=10, strlen(s3)=0 char empty = '\0'; // sizeof(empty)=1 char* s4[] = "world"; // 报错,指针数组不能被一个字符串赋值,即由char*指针构成的数组s4不能用一个字符串赋值 char* s4[] = {"world"}; //正确 char* s4[2] = {"world","m"}; //正确 char s1[] = "world"; // 创建字符串副本(会拷贝字面量")
|
比较std::string、C 风格字符串、字符数组
C风格字符串和字符数组有区别,让我详细解释这些概念及相关头文件:
1. C风格字符串 vs 字符数组
1 2 3 4 5 6 7 8
| char arr1[] = {'H', 'e', 'l', 'l', 'o'}; char arr2[6] = {'H', 'e', 'l', 'l', 'o'};
char str1[] = "Hello"; char* str2 = "Hello"; const char* str3 = "Hello";
|
2. 头文件区别
<string.h>
(C风格)
1 2 3 4 5
| size_t strlen(const char* str); char* strcpy(char* dest, const char* src); char* strcat(char* dest, const char* src); int strcmp(const char* str1, const char* str2);
|
<cstring>
(C++风格的C函数,是C++为了兼容C导致的)
1 2 3
| std::strlen("hello"); std::strcpy(dest, src);
|
<string>
(C++风格)
1 2 3
| #include <string> std::string str = "Hello"; str += " World";
|
3. 常见操作对比
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include <cstring> #include <string>
void demo() { char cstr1[10] = "Hello"; char cstr2[20]; std::strcpy(cstr2, cstr1); std::strcat(cstr2, " World"); size_t len = std::strlen(cstr2);
std::string cpp_str = "Hello"; cpp_str += " World"; size_t length = cpp_str.length(); }
|
4. 字符数组初始化方式
1 2 3 4 5 6 7 8 9 10 11 12 13
| char arr1[] = {'H', 'e', 'l', 'l', 'o', '\0'}; char arr2[] = "Hello"; char arr3[10] = "Hello"; char arr4[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
char words[][6] = { "Hello", "World" };
|
5. 最佳实践建议
**优先使用 std::string
**:
1
| std::string str = "Hello";
|
需要C风格字符串时的转换:
1 2
| std::string cpp_str = "Hello"; const char* c_str = cpp_str.c_str();
|
字符串字面量使用:
1
| const char* str = "Hello";
|
使用string_view避免拷贝:
1 2 3
| void process(std::string_view sv) { }
|
记住:
- C风格字符串必须以
'\0'
结尾
- 字符数组可以不以
'\0'
结尾
- 现代C++推荐使用
std::string
- 处理C API时才使用C风格字符串