C++中的字符串


A string is a variable-length sequence of characters.

使用C++中的string,必须包含<string>,而且相比于C语言中的char *,更推荐使用C++中的写法,更有效率,不容易出错。

声明和初始化

Each class defines how objects of its type can be initialized.

string的初始化可以分为两种:

  • copy initialize
  • direct initialization
// direct initialization
string s1;
string s4(n, 'c')

// copy initialize
string s2(s1);
string s2 = s1;
string s3("value");
// s3 have no '\0' like char *.
string s3 = "value";

string的读写

从控制台读取string,使用cin,读入的string被空格截断,即输入“hello world”,只会将hello放到s中。

string s; // empty string
cin >> s; // read a whitespace-separated string into s

string s1, s2;
// read first input into s1, second into s2
cin >> s1 >> s2;

string word;
// read until end-of-file, use ctrl+c to stop
while (cin >> word) 
    // write each word followed by a new line
    cout << word << endl; 

除了使用cin,还可以使用getline读入整行,但是读入的string中不包含\n

string line;
// read input a line at a time until end-of-file 
while (getline(cin, line))
    cout << line << endl;

string的相关运算

判断大小

  • empty()
  • size()
string line;
while (getline(cin, line)){
    if(!line.empty()){
        if (line.size() > 80){
            cout << line << endl;
        }
    }
}

这里要注意的一点是size()返回的不是int,而是string::size_type,这是一个unsigned的整数,is a companion type. These companion types make it possible to use the library types in a machine-independent manner. 这里容易出问题的是有符号数与无符号数的转换,会出现奇怪的现象。

比较字符串

  • 比较是大小写敏感的;
  • 支持的操作符包括:==、!=、<、 <=、 >、 >=
  • 遵循以下原则:
    • Two strings are equal if they are the same length and contain the same characters.
    • If two strings have different lengths and if every character in the shorter string is equal to the corresponding character of the longer string, then the shorter string is less than the longer one.
    • If any characters at corresponding positions in the two strings differ, then the result of the string comparison is the result of comparing the first character at which the strings differ.
string str = "Hello"; 
string phrase = "Hello World";
string slang = "Hiya";
// str < phrase < slang

算数运算

  • 加法等于字符串拼接
    string s1 = "hello, ", s2 = "world\n";
    string s3 = s1 + s2;    // s3 is hello, world\n 
    s1 += s2;               // equivalent to s1 = s1 + s2
    
  • literal与string的加法中,+左右必须有一个是string对象;
    string s1 = "hello", s2 = "world";
    string s3 = s1 + ", " + s2 + '\n'; // ok
    string s4 = s1 + ", ";             // ok
    string s5 = "hello" + ", ";        // error
    string s6 = s1 + ", " + "world";   // ok
    string s7 = "hello" + ", " + s2;   // error  
    

string与char

遍历

在遍历中,又分为两种:

  • 不修改
    string str("some string");
    for (auto c : str) {
        cout << c << endl;
    }
    
  • 修改
    string s("Hello World!!!");
    for (auto &c : s) {
        c = toupper(c);
    }
    

操作单个char

在遍历中,或者直接操作string中的特定char,可以通过[],类似数组,以0为开始。在访问的过程中,还可以对char进行判断,以便采取相关操作。

针对char的操作

这些函数来自于C语言中的ctype.h和C++中的,使用时直接#include

进一步阅读

除了上述的最常用的内容,在C++ Primer的9.5还描述了一些额外的操作,但是并不太常用,包括:

  • 更复杂的初始化函数;
  • 更多的改变string的函数
  • 搜索字符串的函数
  • 比较string的函数
  • string与其他类型的转换函数

如果需要,可以去查阅。

参考资料

  1. C++ Primer - 3.2 Library string Type

文章作者: alex Li
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 alex Li !
  目录