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
// 字符数组 - 可以不以'\0'结尾
char arr1[] = {'H', 'e', 'l', 'l', 'o'}; // 长度为5
char arr2[6] = {'H', 'e', 'l', 'l', 'o'}; // 长度为6,最后一位为'\0'

// C风格字符串 - 必须以'\0'结尾
char str1[] = "Hello"; // 长度为6,包含结尾的'\0'
char* str2 = "Hello"; // 指向字符串字面量,只读
const char* str3 = "Hello"; // 推荐写法,明确只读性质

2. 头文件区别

<string.h> (C风格)

1
2
3
4
5
// C风格字符串操作函数
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
// 同string.h,但在std命名空间中
std::strlen("hello");
std::strcpy(dest, src);

<string> (C++风格)

1
2
3
#include <string>
std::string str = "Hello"; // C++字符串类
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() {
// C风格
char cstr1[10] = "Hello";
char cstr2[20];
std::strcpy(cstr2, cstr1); // 复制
std::strcat(cstr2, " World"); // 连接
size_t len = std::strlen(cstr2); // 长度

// C++风格
std::string cpp_str = "Hello";
cpp_str += " World"; // 更安全的操作
size_t length = cpp_str.length(); // 或 cpp_str.size()
}

4. 字符数组初始化方式

1
2
3
4
5
6
7
8
9
10
11
12
13
// 不同的初始化方式
char arr1[] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 显式包含'\0'
char arr2[] = "Hello"; // 自动包含'\0'
char arr3[10] = "Hello"; // 剩余位置填充'\0'
char arr4[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; //同1



// 二维字符数组
char words[][6] = {
"Hello",
"World"
};

5. 最佳实践建议

  1. **优先使用 std::string**:

    1
    std::string str = "Hello";
  2. 需要C风格字符串时的转换

    1
    2
    std::string cpp_str = "Hello";
    const char* c_str = cpp_str.c_str(); // 获取C风格字符串
  3. 字符串字面量使用

    1
    const char* str = "Hello";                      // 使用const表明只读
  4. 使用string_view避免拷贝

    1
    2
    3
    void process(std::string_view sv) {             // C++17特性
    // 处理字符串而不需要拷贝
    }

记住:

  • C风格字符串必须以'\0'结尾
  • 字符数组可以不以'\0'结尾
  • 现代C++推荐使用std::string
  • 处理C API时才使用C风格字符串