Skip to the content.

032-字符串

首先是字符,C++中字符占用一个字节,默认使用Ascii字符进行编码,字符串其实就是字符数组,数组是一组元素的集合

声明一个基本的字符串可以使用 const char *name = ""

#include <iostream>

int main() {
    const char *string = "Hello World";
    std::cout << string << std::endl;
    return 0;
}

这样创建的字符串是不在堆上的,所以不能使用delete进行操作

可以在debug模式下查看这个字符串在内存中实际的存储方式,其实就是一个个字符,我们可以看到,数组的末尾为00,这个是终止符,所以读取的时候是从指针的开头读取,一直读取到00终止

image-20220326224419397

所以,我们还可以通过创建一个字符数组并手动初始化它

#include <iostream>

int main() {
    char string[11] = {'H', 'e', 'l', 'l', 'o', ',', 'w', 'o', 'r', 'l', 'd'};
    std::cout << string << std::endl;
    return 0;
}

当输出后,结果是

F:\Projects\ClionProjects\test\cmake-build-debug-cygwin\test.exe
Hello,world0���

进程已结束,退出代码为 0

出现问号的原因是没有写终止符号

修改为如下

#include <iostream>

int main() {
    char string[12] = {'H', 'e', 'l', 'l', 'o', ',', 'w', 'o', 'r', 'l', 'd', 0};
    std::cout << string << std::endl;
    return 0;
}

输出结果正确

F:\Projects\ClionProjects\test\cmake-build-debug-cygwin\test.exe
Hello,world

进程已结束,退出代码为 0

上面的属于c风格字符串


我们可以使用std::string来创建字符串,下面是一些实例

#include <iostream>
#include <string>

std::string toString(bool test) {
    test ? "true" : "false";
}

int main() {
    //创建字符串
    std::string string = "Hello";
    std::cout << string << std::endl;
    //连接字符串
    string += " world";
    std::cout << string << std::endl;
    //或者这样
    std::string string1 = std::string("Hello ") + "world";
    std::cout << string1 << std::endl;
    //求是否包含
    bool test = string.find("He") != std::string::npos;
    std::cout << toString(test) << std::endl;
    return 0;
}

+= +实际上是string对操作符的一些重写

image-20220326224622236

image-20220326224635174

如果我们想写一个输出字符串的方法

std::string print(std::string message) {
    std::cout << message << std::endl;
}

很明显,我们这里只会对字符串进行读取操作,我们直接通过方法传递,会动态的在堆上分配char数组,并一个个复制,实际上是非常慢的

我们可以通过传递引用并添加const,表示我们不会对这个对象进行修改

std::string print(const std::string &message) {
    std::cout << message << std::endl;
}

string API http://www.cplusplus.com/reference/string/string/


https://www.bilibili.com/video/BV1bf4y1e7ZB