C++ 字符串与字符数组

梦想不会自己发光,真正闪耀的是那个为梦狂奔的你。献给知行的孩子们!(Eric.He著)


  本教程将全面讲解 C++ 中字符数组与 string 字符串的核心概念、使用方法、输入输出技巧,以及两者的相互转换,帮助你掌握字符串处理的核心能力。

教程目录导航

一、核心概念与关系

1.1 字符数组与string的定义

字符数组:是存储字符类型数据的数组,本质是连续的字符存储空间,以 '\0'(空字符)作为结束标志,是 C 语言遗留的字符串处理方式。

string 字符串:是 C++ 标准库(STL)提供的字符串类,封装了字符数组的底层实现,提供了丰富的成员函数,是 C++ 中推荐的字符串处理方式。

1.2 字符数组与string的关系

特性 字符数组 string 字符串
底层实现 固定长度的字符数组,手动管理内存 动态字符数组,自动管理内存
长度限制 定义时固定长度,超出易越界 动态扩容,无长度限制
操作便捷性 需手动调用C库函数(如strlen、strcpy) 内置成员函数,支持直接赋值、拼接等
安全性 易出现越界、内存泄漏问题 自动处理边界,安全性更高
兼容性 兼容C语言,可直接用于C风格接口 C++专属,需转换才能用于C风格接口

二、字符数组的使用

2.1 字符数组的定义

字符数组有多种定义和初始化方式,核心需注意 '\0' 结束符的自动补充。

语法格式与示例:


#include <iostream>
// 字符数组操作需包含C字符串库
#include <cstring>
using namespace std;

int main() {
    // 方式1:直接初始化(自动添加'\0')
    char str1[] = "Hello C++";
    cout << "str1: " << str1 << endl;
    cout << "str1长度:" << strlen(str1) << endl; // 输出:9(不含'\0')
    cout << "str1内存大小:" << sizeof(str1) << endl; // 输出:10(包含'\0')

    // 方式2:指定长度初始化(剩余位置补'\0')
    char str2[20] = "Character Array";
    cout << "\nstr2: " << str2 << endl;

    // 方式3:逐个字符初始化(需手动加'\0')
    char str3[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
    cout << "\nstr3: " << str3 << endl;

    // 方式4:空字符数组(需后续赋值)
    char str4[50];
    strcpy(str4, "Manual Assignment"); // 用strcpy赋值
    cout << "\nstr4: " << str4 << endl;

    return 0;
}
        

2.2 字符数组的输入输出

字符数组支持流式输入输出(cin/cout)和格式化输入输出(scanf/printf),需注意输入时的空格处理。

方式1:流式输入输出(cin/cout)


#include <iostream>
using namespace std;

int main() {
    char str[50];
    cout << "请输入字符串(cin):";
    cin >> str; // 输入:Hello World 只会读取"Hello"
    cout << "输出:" << str << endl; // 输出:Hello
    return 0;
}
        

方式2:cin.getline() 输入(读取整行,含空格)


#include <iostream>
using namespace std;

int main() {
    char str[50];
    cout << "请输入字符串(getline):";
    cin.getline(str, 50); // 读取最多49个字符(留1位存'\0')
    cout << "输出:" << str << endl; // 输入:Hello World 输出完整内容
    return 0;
}
        

方式3:cout 输出(自动识别'\0'终止)


#include <iostream>
using namespace std;

int main() {
    char str[] = "C++ Character Array";
    cout << "直接输出:" << str << endl;
    // 逐个字符输出
    cout << "逐个输出:";
    for (int i = 0; str[i] != '\0'; i++) {
        cout << str[i];
    }
    cout << endl;
    return 0;
}
        

方式4:格式化输入输出(scanf/printf)


#include <iostream>
#include <cstdio>  // 格式化输入输出头文件
using namespace std;

int main() {
    char arr[20];
    
    // 格式化输入:%s 读取无空格字符串,自动补'\0'
    cout << "输入字符串(无空格):";
    scanf("%s", arr);  // 字符数组名本身是地址,无需&
    printf("格式化输出:%s\n", arr);
    
    // 读取整行(包含空格):%[^\n] 匹配到换行符为止
    char arr2[20];
    getchar();  // 清空缓冲区换行符
    cout << "输入带空格的字符串:";
    scanf("%[^\n]", arr2);
    printf("整行格式化输出:%s\n", arr2);

    return 0;
}
        

三、string字符串的使用

3.1 string的定义与初始化

string 是 C++ 标准库类,支持多种灵活的初始化方式,无需关注内存和结束符。


#include <iostream>
// 使用string需包含头文件
#include <string>
using namespace std;

int main() {
    // 方式1:空字符串初始化
    string str1;
    str1 = "Empty String";
    cout << "str1: " << str1 << endl;

    // 方式2:直接赋值初始化
    string str2 = "C++ String Class";
    cout << "\nstr2: " << str2 << endl;

    // 方式3:拷贝初始化
    string str3 = str2;
    cout << "\nstr3: " << str3 << endl;

    // 方式4:部分初始化(从str2截取前5个字符)
    string str4(str2, 0, 5);
    cout << "\nstr4: " << str4 << endl;

    // 方式5:重复字符初始化
    string str5(5, 'A');
    cout << "\nstr5: " << str5 << endl; // 输出:AAAAA

    return 0;
}
        

3.2 string的输入输出

string 的输入输出比字符数组更灵活,支持整行读取且无需担心长度限制。

方式1:cin 输入(遇空格终止)


#include <iostream>
#include <string>
using namespace std;

int main() {
    string str;
    cout << "请输入字符串(cin):";
    cin >> str; // 输入:Hello C++ 读取"Hello"
    cout << "输出:" << str << endl;
    return 0;
}
        

方式2:getline() 输入(读取整行,含空格)


#include <iostream>
#include <string>
using namespace std;

int main() {
    string str;
    cout << "请输入字符串(getline):";
    // 忽略前一个换行符(避免cin残留的换行影响)
    cin.ignore();
    getline(cin, str); // 输入:Hello C++ String 完整读取
    cout << "输出:" << str << endl;
    return 0;
}
        

方式3:cout 输出


#include <iostream>
#include <string>
using namespace std;

int main() {
    string str = "C++ String 输出示例";
    cout << "直接输出:" << str << endl;
    
    // 逐个字符输出
    cout << "逐个输出:";
    for (int i = 0; i < str.size(); i++) {
        cout << str[i];
    }
    cout << endl;
    return 0;
}
        

3.3 string常用成员函数

string 类提供了丰富的成员函数,覆盖字符串的长度、拼接、查找、替换等操作:


#include <iostream>
#include <string>
using namespace std;

int main() {
    string str = "C++ String Function";
    
    // 1. 长度相关:size()/length()(等价)
    cout << "字符串长度:" << str.size() << endl;
    cout << "字符串长度:" << str.length() << endl;

    // 2. 拼接:+= / append()
    str += " Test";
    cout << "\n拼接后:" << str << endl;
    str.append(" Append");
    cout << "append拼接:" << str << endl;

    // 3. 查找:find()
    int pos = str.find("Function");
    if (pos != string::npos) {
        cout << "\n找到Function,位置:" << pos << endl;
    }

    // 4. 替换:replace()
    str.replace(pos, 8, "Method"); // 从pos位置替换8个字符为"Method"
    cout << "替换后:" << str << endl;

    // 5. 截取:substr()
    string sub = str.substr(0, 5); // 从0位置截取5个字符
    cout << "\n截取子串:" << sub << endl;

    // 6. 清空:clear()
    str.clear();
    cout << "清空后长度:" << str.size() << endl;

    // 7. 判空:empty()
    if (str.empty()) {
        cout << "字符串为空" << endl;
    }

    return 0;
}
        

常用函数速查表:

四、字符数组与string的相互转换

实际开发中常需在字符数组和 string 之间转换,以下是核心方法:

4.1 string 转字符数组


#include <iostream>
#include <string>
using namespace std;

int main() {
    string str = "Convert to Char Array";
    
    // 方式1:c_str() (推荐,返回const char*)
    const char* charArr1 = str.c_str();
    cout << "c_str()转换:" << charArr1 << endl;

    // 方式2:copy() (拷贝到已有字符数组)
    char charArr2[50];
    str.copy(charArr2, str.size(), 0); // 从0位置拷贝str.size()个字符
    charArr2[str.size()] = '\0'; // 手动添加结束符
    cout << "copy()转换:" << charArr2 << endl;

    return 0;
}
        

4.2 字符数组转 string


#include <iostream>
#include <string>
using namespace std;

int main() {
    char charArr[] = "Convert to String";
    
    // 方式1:直接赋值
    string str1 = charArr;
    cout << "直接赋值转换:" << str1 << endl;

    // 方式2:构造函数初始化
    string str2(charArr);
    cout << "构造函数转换:" << str2 << endl;

    // 方式3:assign() 赋值
    string str3;
    str3.assign(charArr);
    cout << "assign()转换:" << str3 << endl;

    return 0;
}
        

五、注意事项

六、总结

掌握字符数组与 string 的使用和转换,是 C++ 字符串处理的核心,也是文件操作、网络编程等场景的基础能力。


返回顶部