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进行判断,以便采取相关操作。
这些函数来自于C语言中的ctype.h
和C++中的#include
。
进一步阅读
除了上述的最常用的内容,在C++ Primer的9.5还描述了一些额外的操作,但是并不太常用,包括:
- 更复杂的初始化函数;
- 更多的改变string的函数
- 搜索字符串的函数
- 比较string的函数
- string与其他类型的转换函数
如果需要,可以去查阅。
参考资料
- C++ Primer - 3.2 Library string Type