一、初始化string对象的方式
1 #include <iostream> 2 #include <string> 3 4 using std::cout; 5 using std::endl; 6 using std::string; 7 void output(string desc, string s){ 8 cout << desc << ":" << s << endl; 9 } 10 int main() 11 { 12 string s1; // 默认初始化,s1是一个空串 13 string s2(s1); // s2是s1的副本 14 string s3 = s1; // 等价于s3(s1) 15 string s4("value"); // s4是字面值"value"的副本,除了字面值最后的那个空字符外 16 string s5 = "value"; // 等价于s5("value") 17 string s6(10, 'c'); // 把s6初始化成由连续10个字符c组成的串 18 output("s1", s1); 19 output("s2", s2); 20 output("s3", s3); 21 output("s4", s4); 22 output("s5", s5); 23 output("s6", s6); 24 return 0; 25 }
输出:
注意:任何出现字符串字面值的地方都可以用以空字符结束的字符数组来替代(以空字符结束的指针也可以)。
二、string的常用操作
1)is>>s:从is中读取字符串赋给s,字符串以空白分隔,返回is。
在执行读取操作时,string对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始读起,知道遇到下一处空白为止。
1 #include <iostream> 2 #include <string> 3 4 using std::cin; 5 using std::cout; 6 using std::endl; 7 using std::string; 8 int main() 9 { 10 string s; 11 cin >> s; 12 cout << "|" << s << "|" << endl; 13 return 0; 14 }
如果输入是" hello world! ",那么输出是:
2)getline(is,s):从is中读取一行赋给s,返回is。
函数从给定的输入流中读入内容,直到遇到换行符为止(注意换行符也被读进来了),然后把所读的内容存入到那个string对象中去(注意不存换行符)。getline只要一遇到换行符就结束读取操作并返回结果,哪怕输入的一开始就是换行符也是如此。如果输入一开始就是换行符,那么所得的结果就是个空string。
1 #include <iostream> 2 #include <string> 3 4 using std::cin; 5 using std::cout; 6 using std::endl; 7 using std::string; 8 int main() 9 { 10 string s; 11 while (getline(cin,s)) 12 { 13 cout << "|" << s << "|" << endl; 14 } 15 return 0; 16 }
如果输入是" hello world! ",那么输出是:
3)s.empty():s为空返回true,否者返回false。
4)s.size():返回s中字符的个数。
size()函数返回的是一个string::size_type类型的值,是一个无符号的值而且能够存放下任何string对象的大小。
5)s[n]:返回s中第n个字符的引用,位置n从0计起。
6)s1+s2:返回s1和s2连接后的结果。
两个string对象相加得到一个新的string对象,其内容是把左侧的运算对象和右侧的运算对象串接而成。
复合赋值运算符(+=)负责把右侧string对象的内容追加到左侧string对象的后面。
c++语言中的字符串字面值并不是标准库类型string的对象。标准库允许把字符字面值和字符串字面值转换成string对象,所以在需要string对象的地方就可以使用这两种字面值来代替,但是当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符(+)的两侧的运算对象至少有一个是string。
7)s1=s2:用s2的副本代替s1中原来的字符。
8)s1==s2:如果s1和s2中所含的字符完全一样,则它们相等;string对象的相等性判断对字母的大小写敏感。
9)<,<=,>,>=:利用字符在字典序中的顺序进行比较,且大小写敏感。
三、字符操作函数
在cctype头文件中定义了一组标准库函数处理字符。下列的函数从属于命名空间std。
函数 | 说明 |
isalnum(c) | 当c是字母或数字时为真。 |
isalpha(c) | 当c是字母时为真。 |
iscntrl(c) | 当c是控制字符时为真。 |
isdigit(c) | 当c是数字时为真。 |
isgraph(c) | 当c不是空格但可打印时为真。 |
islower(c) | 当c是小写字母时为真。 |
isprint(c) | 当c是可打印字符时为真(即c是空格或c具有可视形式)。 |
ispunct(c) | 当c是标点符号时为真(即c不是控制字符、数字、字母、可打印空白中的一种)。 |
isspace(c) | 当c是空白时为真(即c是空格、横向制表符、纵向制表符、回车符、换行符、进纸符中的一种)。 |
isupper(c) | 当c是大写字母时为真。 |
isxdigit(c) | 当c是十六进制数字时为真。 |
tolower(c) | 如果c是大写字母,输出对应的小写字母;否则原样输出c。 |
toupper(c) | 如果c是小写字母,输出对应的大写字母;否则原样输出c。 |
四、C风格字符串
1、简介
字符串字面值是一种通用结构的实例,这种结构即是C++由C继承而来的C风格字符串。C风格字符串不是一种类型,而是为了表达和使用字符串而形成的一种约定俗成的写法。按此习惯书写的字符串存放在字符数组中并以空字符结束。以空字符结尾的意思是在字符串最后一个字符后面跟着一个空字符(' ')。
2、C标准库String函数
下列函数定义在cstring头文件中,cstring是c语言头文件string.h的C++版本。
- strlen(p) //返回p的长度,空字符不计算在内。
- strcmp(p1,p2) //比较p1和p2的相等性。如果p1==p2则返回0,;如果p1>p2,则返回一个正值1;如果p1<p2,返回一个负值-1.
- strcat(p1,p2) //将p2附加到p1之后,p2的空字符也会附加上,返回p1
- strcpy(p1,p2) //将p2拷贝给p1,p2的空字符也会拷贝过去,返回p1
注意:传入上述函数的指针必须指向以空字符作为结束的数组。
3、string和字符数组的转换
string对象提供了c_str()函数,该函数的返回值是一个C风格的字符串。也就是说,该函数的返回结果是一个指针,该指针指向一个以空字符结束的字符数组,而这个字符数组所存的 数据恰好与那个string对象一样。结果指针的类型是const char *,从而确保我们不会改变字符数组的内容。
注意:我们无法保证c_str函数返回的数组一直有效,事实上,如果后续的操作改变了string对象的值就可能让之前返回的数组失去作用。因此,如果执行完c_str函数后程序想一直都能使用其返回的数组,最好将该数组重新拷贝一份。