C++ 字符串

字符串就是由多个字符组成的一串,就像英文由 26 个字母组成的是一个道理

比如由 H,e,l,l,o,\0 可以组成一个字符串 Hello ,那最后那个 \0 是什么意思呢?

\0 其实就是 NULL,表示的是一个字符串的结束,就像换行符用来表示一个段落的结束是同样的道理

字符数组

既然字符串是由多个字符组成的串,那么我们首先想到的应该是,字符串是一个字符数组,比如这样

char hello[] = {'H','e','l','l','o','\0'};

比如我们使用 std::cout 输出字符数组 hello 就会得到如下值

/**
 * file: main.cpp
 * author: 简单教程(www.twle.cn)
 *
 * Copyright © 2015-2065 www.twle.cn. All rights reserved.
 */
#include <iostream>

int main ()
{

    char hello[] = {'H','e','l','l','o','\0'};
    std::cout << hello << std::endl;

    char world[] = {'W','o','r','l','d','\0','H','i','\0'};
    std::cout << world << std::endl;

    return 0;
}

编译运行上面的代码,输出结果如下

Hello
World

你可能会问,最后那个 \0 怎么没输出,还有 Hi 怎么也没有输出

上面我们说到,\0 是表示字符串结束,它不是字符串的组成部分

std::cout 在输出字符数组的时候,它会把数组当作字符串来处理,遇到 \0 就表示字符串结束了,所以 Hi 就被抛弃了

字符数组的内存布局

下面的声明和初始化创建了一个 "Hello" 字符串

char hello[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

由于在数组的末尾存储了空字符,所以字符数组的大小比单词 "Hello" 的字符数多一个

greeting 字符串在内存中是如何表示的呢? 先来看看这张图

C/C++ 中的字符串表示

依据数组初始化规则,可以把上面的语句写成以下语句

char greeting[] = "Hello";

为什么末尾没有 \0

其实,不需要把 NULL (\0 ) 字符放在字符串常量的末尾, C++ 编译器会在初始化数组时,自动把 \0 放在字符串的末尾

操作字符数组的函数

C++ 在头文件 <cstring> 中包含了大量的的函数用来操作以 \0 结尾的字符数组 (字符串)

函数 说明
strcpy(s1, s2) 复制字符串 s2 到字符串 s1
strcat(s1, s2) 连接字符串 s2 到字符串 s1 的末尾
strlen(s1) 返回字符串 s1 的长度
strcmp(s1, s2) 如果 s1 和 s2 是相同的,则返回 0;如果 s1s2 则返回大于 0
strchr(s1, ch) 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置
strstr(s1, s2) 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置

我们写一个范例来演示下这些函数的使用

/**
 * file: main.cpp
 * author: 简单教程(www.twle.cn)
 *
 * Copyright © 2015-2065 www.twle.cn. All rights reserved.
 */

#include <iostream>
#include <cstring>

int main ()
{
    char str1[11] = "Hello";
    char str2[11] = "World";
    char str3[11];
    int  len ;

    // 复制 str1 到 str3
    strcpy( str3, str1);
    std::cout << "strcpy( str3, str1) : " << str3 << std::endl;

    // 连接 str1 和 str2
    strcat( str1, str2);
    std::cout << "strcat( str1, str2): " << str1 << std::endl;

    // 连接后,str1 的总长度
    len = strlen(str1);
    std::cout << "strlen(str1) : " << len << std::endl;

    return 0;
}

编译和运行以上范例,输出结果如下

strcpy( str3, str1) : Hello
strcat( str1, str2): HelloWorld
strlen(str1) : 10

C++ std::string 类

我们日常处理和交流使用的都是字符串而不是字符,所以 C++ 通过标准库的形式专门提供了一个字符串类型 std::string

头文件

使用 C++ 提供的 std::string 类型需要包含头文件 <string>

#include <string>

如果想去掉命名空间前缀 std:: ,则可以加上 using namespace std;

#include <string>

using namespace std;

创建 string 变量

std::string 类型的使用和其它基本类型,比如 int,short 一样

比如说声明一个字符串变量的形式如下

string hello = "Hello";

string 操作符

还可以对字符串使用加法(+)运算符,那么就是拼接两个字符串成一个字符串

string hello = "Hello";
string world = "World";

string hello_world  = hello + world; // 得到 "HelloWorld";
string hello_world2 = hello + " " + world; // // 得到 "Hello World";

我们写一个例子来演示下 string

/**
 * file: main.cpp
 * author: 简单教程(www.twle.cn)
 *
 * Copyright © 2015-2065 www.twle.cn. All rights reserved.
 */

#include <iostream>
#include <string>

int main ()
{
   std::string str1 = "Hello";
   std::string str2 = "World";
   std::string str3;
   int  len ;

   // 复制 str1 到 str3
   str3 = str1;
   std::cout << "str3 : " << str3 << std::endl;

   // 连接 str1 和 str2
   str3 = str1 + str2;
   std::cout << "str1 + str2 : " << str3 << std::endl;

   // 连接后,str3 的总长度
   len = str3.size();
   std::cout << "str3.size() :  " << len << std::endl;

   return 0;
}

编译和运行以上范例,输出结果如下

str3 : Hello
str1 + str2 : HelloWorld
str3.size() :  10

C++ 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.