原文: https://beginnersbook.com/2017/08/strings-in-c/

字符串是由字符组成的单词,因此它们被称为字符序列。在 C++ 中,我们有两种方法来创建和使用字符串:1)通过创建char数组并将它们视为字符串 2)通过创建string对象

让我们先讨论这两种创建字符串的方法,然后我们会看到哪种方法更好,为什么。

1)字符数组 - 也称为 C 字符串

例 1:

一个简单例子,我们在声明期间初始化了char数组。

  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4. char book[50] = "A Song of Ice and Fire";
  5. cout<<book;
  6. return 0;
  7. }

输出:

  1. A Song of Ice and Fire

示例 2:将用户输入作为字符串

这可以被视为读取用户输入的低效方法,为什么?因为当我们使用cin读取用户输入字符串时,只有字符串的第一个单词存储在char数组中而其余部分被忽略。cin函数将字符串中的空格视为分隔符,并忽略其后的部分。

  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4. char book[50];
  5. cout<<"Enter your favorite book name:";
  6. //reading user input
  7. cin>>book;
  8. cout<<"You entered: "<<book;
  9. return 0;
  10. }

输出:

  1. Enter your favorite book name:The Murder of Roger Ackroyd
  2. You entered: The

你可以看到只有The被捕获在book中,空格之后的剩下部分被忽略。那怎么处理呢?那么,为此我们可以使用cin.get函数,它读取用户输入的完整行。

示例 3:使用 cin.get 正确捕获用户输入字符串的方法

  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4. char book[50];
  5. cout<<"Enter your favorite book name:";
  6. //reading user input
  7. cin.get(book, 50);
  8. cout<<"You entered: "<<book;
  9. return 0;
  10. }

输出:

  1. Enter your favorite book name:The Murder of Roger Ackroyd
  2. You entered: The Murder of Roger Ackroyd

这种方法的缺点

1)char数组的大小是固定的,这意味着通过它创建的字符串的大小是固定大小的,在运行时期间不能分配更多的内存。例如,假设您已创建一个大小为 10 的字符数组,并且用户输入大小为 15 的字符串,则最后五个字符将从字符串中截断。

另一方面,如果您创建一个更大的数组来容纳用户输入,那么如果用户输入很小并且数组比需要的大得多,则会浪费内存。

2)在这种方法中,你只能使用为数组创建的内置函数,它们对字符串操作没有多大帮助。

这些问题的解决方案是什么?

我们可以使用字符串对象创建字符串。让我们看看我们如何做到这一点。

C++ 中的string对象

到目前为止我们已经看到了如何使用char数组处理 C++ 中的字符串。让我们看看在 C++ 中处理字符串的另一种更好的方法 - 字符串对象。

  1. #include<iostream>
  2. using namespace std;
  3. int main(){
  4. // This is how we create string object
  5. string str;
  6. cout<<"Enter a String:";
  7. /* This is used to get the user input
  8. * and store it into str
  9. */
  10. getline(cin,str);
  11. cout<<"You entered: ";
  12. cout<<str<<endl;
  13. /* This function adds a character at
  14. * the end of the string
  15. */ str.push_back('A');
  16. cout<<"The string after push_back: "<<str<<endl;
  17. /* This function deletes a character from
  18. * the end of the string
  19. */
  20. str.pop_back();
  21. cout << "The string after pop_back: "<<str<<endl;
  22. return 0;
  23. }

输出:

  1. Enter a String:XYZ
  2. You entered: XYZ
  3. The string after push_back: XYZA
  4. The string after pop_back: XYZ

使用这种方法的好处是你不需要声明字符串的大小,大小是在运行时确定的,所以这是更好的内存管理方法。内存在运行时动态分配,因此不会浪费内存。