| 12
 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 字符数组
| 12
 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风格)
| 12
 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导致的)
| 12
 3
 
 | std::strlen("hello");
 std::strcpy(dest, src);
 
 | 
<string> (C++风格)
| 12
 3
 
 | #include <string>std::string str = "Hello";
 str += " World";
 
 | 
3. 常见操作对比
| 12
 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. 字符数组初始化方式
| 12
 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风格字符串时的转换: | 12
 
 | std::string cpp_str = "Hello";const char* c_str = cpp_str.c_str();
 
 |  
 
- 字符串字面量使用: | 1
 | const char* str = "Hello";                      
 |  
 
- 使用string_view避免拷贝: | 12
 3
 
 | void process(std::string_view sv) {             
 }
 
 |  
 
记住:
- C风格字符串必须以'\0'结尾
- 字符数组可以不以'\0'结尾
- 现代C++推荐使用std::string
- 处理C API时才使用C风格字符串