跳至正文
View Categories

5 min read

C++中的字符串(char数组)回顾 #

  • 字符串是借用一维字符数组来存放的,并规定以\0结尾。
  • 字符串使用双引号表示。””
  • 字符串并不是字符数组
  • 它们的定义方式不同
// 字符串的定义
char dashima[] = "A123*";           // 请问如何求长度,长度应该是多少?


// 字符数组的定义
char dashima[] = {'A','1','3','*'}  // 请问如何求长度,长度应该是多少?
  • 它们都不可以直接赋值,只可以用 [ ] 索引
// 字符串的定义
char dsm_string[] = "A123*"; // 
dsm_string   = "ac";    // 【错误】
dsm_string[1] = 'a';    // 【正确】
dsm_string[100] = 'a';  // 【语法正确】,但是实际上超出了长度范围。要【特别注意】,避免这样的错误,编译时并不会提示这种错误。

// 字符数组的定义
char dsm_cArray[] = {'A','1','3','*'}
dsm_cArray   = "ac";    // 【错误】
dsm_cArray[1] = 'a';    // 【正确】
dsm_cArray[100] = 'a';  // 【语法正确】,但是实际上超出了长度范围。
  • 它们都可以直接输出
// 字符串的定义
char dsm_string[] = "A123*"; // 
cout << dsm_string << "\n";

// 字符数组的定义
char dsm_cArray[] = {'A','1','3','*'}
cout << dsm_cArray << "\n";
  • 字符串尾后会自动加上 ‘\0’,所以它们的 sizeof() 结果有差异。
  • 它们求 strlen() 的处理方式相同,只要遇到 ‘\0’ 就停止计数。输出结果不统计 ‘\0’

请看例子,并回答输出结构【请注意理解】

// 例子 1 ----------------------------------------
char dsm_string[] = "A13*";
char dsm_cArray[] = {'A','1','3','*'};

cout << sizeof(dsm_string) << "\n";    // 5
cout << sizeof(dsm_cArray) << "\n";    // 4

cout << strlen(dsm_string) << "\n";    // 4
cout << strlen(dsm_cArray) << "\n";    // 4

// 例子 2 ----------------------------------------
char dsm_string[] = "A13*\0";
char dsm_cArray[] = {'A','1','3','*','\0'};

cout << sizeof(dsm_string) << "\n";    // 6
cout << sizeof(dsm_cArray) << "\n";    // 5

cout << strlen(dsm_string) << "\n";    // 4
cout << strlen(dsm_cArray) << "\n";    // 4

// 例子 3 ----------------------------------------
char dsm_string[] = "A13*\0A13";
char dsm_cArray[] = {'A','1','3','*','\0','A','1','3'};

cout << sizeof(dsm_string) << "\n";    // 9
cout << sizeof(dsm_cArray) << "\n";    // 8

cout << strlen(dsm_string) << "\n";    // 4
cout << strlen(dsm_cArray) << "\n";    // 4

string #

定义 #

字符串在 C++ 中很重要,而基础的 char [] 形式的字符串,在使用上不是很友好。
比如:str1、str2两个字符串,则 str1 = str2 这样的写法是【错误的】。但是使用【=】复合大多数人的习惯。
所以,后来的 C++ 中定义了一种 string 类型,来专门表示字符串。

请看例程

#include < iostream >
#include < string >

int main()
{
    std::string str1("da");  // string 属于 std 名称空间
    std::string str2 = "dashima";
    str1 = str2;     // 【正确】
    return 0;
}

string 是 C++ 标准库中的【类】,类也是一种自定义的数据类型。就像我们讲过的枚举、struct结构体等,都属于自定义数据类型。

  • 这里的 string 的使用方法更加像一般的变量,比如 int 。【请记住这一点】

输入输出 #

依然可以使用 cin 和 cout。
cin,请注意读取的时候,会忽略开头的【空格】【制表符】【换行符】,当遇到【空格】【制表符】【换行符】则停止读取。

示例程序:

#include < iostream >
#include < string >
using namespace std;
int main()
{
    // 例子 1 ----------------------------------------
    string str;

    cout << "请输入一个字符串:\n"; // 请试一试输入:"Hello World",并尝试在开头加上空格。
    cin >> str;
    cout << str << "\n\n\n";

    // 例子 2 ----------------------------------------
    string str1, str2, str3;
    cout << "请输入3个字符串,可以使用空格分隔,也可以逐行输入:\n"; // 【空格】【制表符】【换行符】都可以作为字符串的分隔。
    cin >> str1 >> str2 >> str3;
    cout << str1 << "\n";
    cout << str2 << "\n";
    cout << str3 << "\n";
    
    return 0;
}

string的常用操作 #

string::empty() #

函数说明:用于按断该字符串是否为一个【空字符串】。
请看例程:

#include < iostream >
using namespace std;
int main()
{
    string str;
    bool is_empty = str.empty();
    cout << is_empty << "\n";         // 输出 1

    str="da shi ma";
    cout << str.empty() << "\n";      // 输出 0
    return 0;
}

string::size() #

函数说明:用于按断该字符串的【长度】。
请看例程:

#include < iostream >
using namespace std;
int main()
{
    string str;
    str="123456789";
    size_t len = str.size();      // size_t 就是 unsigned long long 
    cout << str.size() << "\n";   // 输出 9
    return 0;
}

[] ,索引符号 #

说明:用于【读/写】该字符串中某一位的字符,【要是超出范围会报错】。
请看例程:

#include < iostream >
using namespace std;
int main()
{
    string str="123456789";

    // 输出 123456789
    for(int i=0; i < str.size(); ++i)
        cout << str[i];      
       
    return 0;
}

+ 和 +=, 合并字符串 #

说明:用于合并两个字符串。
请看例程:

#include < iostream >
using namespace std;
int main()
{
    // 例子 1 ------------------------------------------
    string str1="1234";
    string str2="5678";
    cout << str1 + str2 << "\n";
    

    // 例子 2 ------------------------------------------
    string str = str1 + str2;
    cout << str1;
    

    // 例子 3 ------------------------------------------
    str1 = str1 + "   Hello World!"; // Hello 前有 3 个空格
    cout << str1;                    // 输出 "1234   Hello World!"   


    // 例子 4 ------------------------------------------
    str1 = "1234";
    str1 += "   Hello World!";       // 【注意】和数值变量中的 += 意义相同
    cout << str1;                    // 输出 "1234   Hello World!"  

    return 0;
}

【注意】没有减法哦!

= ,赋值 #

说明:修改 string 变量的值。
这个已经介绍过了。

string::substr(int pos, int n) #

函数说明:返回从下标 pos 起的 n 个字符,类型为 string。
请看例程:

#include < iostream >
#include < string >
using namespace std;
int main()
{
    string str;
    str="0123456789";

    string substring = str.substr(5, 3);
    cout << substring << "\n";
    return 0;
}

string::find(string s2, int pos) #

函数说明:在下标 pos 起,查找 s2 第一次出现的位置。
请看例程:

#include < iostream >
#include < string >
using namespace std;
int main()
{
    string str = "0123456789";

    int i = str.find("123", 0); // 例子 1
    cout << i << "\n";

    int i = str.find("123", 5); // 例子 2
    cout << i << "\n";

    return 0;
}

比较运算符 #

说明:比较字符串。使用的符号,均和数值变量一致
请看例程:

#include < iostream >
using namespace std;
int main()
{
    // 例子 1 ------------------------------------------
    string str1("abc"), str2("abc");

    bool 
    res = st1 == str2; // 这些比较方法都成立,等于
    res = st1 >= str2; // 这些比较方法都成立,大于等于
    res = st1 > str2;  // 这些比较方法都成立,大于
    res = st1 <= str2; // 这些比较方法都成立,小于等于
    res = st1 < str2;  // 这些比较方法都成立,小于
    res = st1 != str2; // 这些比较方法都成立,不等于

    return 0;
}

你还记得字符串的比较规则吗?请回答。

字符串的比较规则:长度相同则逐一按照 ASCII 的数值大小比较。

string高级用法 #

string::insert(int pos, string s2) #

函数说明:在字符串的下标为 pos 的元素之前,插入 s2。
请看例程:

#include < iostream >
#include < string >
using namespace std;
int main()
{
    string str;
    str="0123456789";
    str.insert(5, "abc"); // 例子 1
    cout << str << "\n";

    str="0123456789";
    string sub("xyz");
    str.insert(9, sub);    // 例子 2
    cout << str << "\n";

    str="0123456789";
    str.insert(10, sub);    // 例子 3
    cout << str << "\n";

    return 0;
}

string::erase(int pos, int n) #

函数说明:删除从下标 pos 起的 n 个字符。
请看例程:

#include < iostream >
#include < string >
using namespace std;
int main()
{
    string str;
    str="0123456789";

    str.erase(5, 3);
    cout << str << "\n";
    return 0;
}

string::replace(int pos, int n, string s2) #

函数说明:将从下标 pos 起的 n 个字符,替换为 s2。
请看例程:

#include < iostream >
#include < string >
using namespace std;
int main()
{
    string str ="0123456789", s2 = "xyz";

    str.replace(5, 3, s2); // 例子 1
    cout << str << "\n";

    str ="0123456789";
    str.replace(5, 2, s2); // 例子 2
    cout << str << "\n";

    str ="0123456789";
    str.replace(5, 1, s2); // 例子 3
    cout << str << "\n";

    return 0;
}

string::c_str() #

函数说明:返回一个与 s 内容相同的 C 语言风格的字符串临时指针。
请看例程:

#include < iostream >
#include < string >
using namespace std;
int main()
{
    string str = "0123456789";

    const char * cStrPointer = str.c_str();
    cout << cStrPointer << "\n";

    return 0;
}

习题 #

首先可以尝试将上一节的习题用新学习的string重新实现一遍

字符串的出现次数

回文字符串

字符串分离