8.11.2 连接字符串(2)
ages通常是一个整数数组,但这里把它当成是一个字符串数组,只是为了更多地使用字符串。这个示例产生类似下面的输出:
- Enter a first name or press Enter to end: Marilyn
- Enter a second name: Munroe
- Enter Marilyn's age: 26
- Enter a first name or press Enter to end: Tom
- Enter a second name: Crews
- Enter Tom's age: 45
- Enter a first name or press Enter to end: Arnold
- Enter a second name: Weisseneggar
- Enter Arnold's age: 52
- Enter a first name or press Enter to end:
- The names you entered are:
- Marilyn Munroe aged 26.
- Tom Crews aged 45.
- Arnold Weisseneggar aged 52.
- Done!!
示例说明
listnames函数列出存储在数组中的姓名和年龄(它们作为前两个实参传递)。第三个实参是数组中元素的个数。数据的清单出现在一个循环中:
- for(size_t i = 0 ; i < count && !names[i].empty() ; ++i)
- cout << names[i] + " aged " + ages[i] + '.' << endl;
循环条件是双重保险(belt and brace)控制机制,它不仅检查索引i是否小于作为第三个实参传递的count的值,而且还调用当前元素的empty()函数来确认它不是空字符串。循环体中的那个语句用+运算符连接names[i]中的当前字符串与字面值"aged"、ages[i]字符串及字符'.',并将产生的字符串写到cout中。这个连接字符串的表达式等价于:
- ((names[i].operator+(" aged ")).operator+(ages[i])).operator+('.')
每次调用operator+()函数都会返回一个新的string对象。所以此表达式演示了将一个string对象与一个字符串字面值合并,将一个string对象与另一个string对象合并,以及将一个string对象与一个字符字面值合并。
虽然上面的代码演示说明了string::operator+()函数的用法,但出于性能考虑使用下面的语句:
- cout << names[i] << " aged " << ages[i] << '.' << endl;
这避免了调用运算符函数和由此而导致的创建所有字符串对象。
在main()中,首先用下面的语句创建两个string对象的数组,长度为count:
- const size_t count = 100;
- string names[count];
- string ages[count];
names和ages数组将存储从键盘上输入的姓名和相应的年龄值。
在main()的for循环内,分别用getline()函数模板来读取姓和名:
- cout << endl << "Enter a first name or press Enter to end: ";
- getline(cin, firstname, '\n');
- if(firstname.empty())
- {
- listnames(names, ages, i);
- cout << "Done!!" << endl;
- return 0;
- }
- cout << "Enter a second name: ";
- getline(cin, secondname, '\n');
getline()函数允许读空字符串,而使用cin的>>运算符不能读空字符串。getline()的第一个实参是作为输入源的流,第二个实参是输入的目的地,第三个实参是标志输入操作结束的字符。如果省略第三个实参,输入'\n'将终止输入过程,因此这里可以省略第三个实参。使用读空字符串的能力来测试firstname中的空字符串(通过调用它的empty()函数)。由于空字符串是输入结束的信号,因此调用listnames()来输出数据,并结束程序的执行。
当firstname不为空时,继续用getline()模板函数将姓读入secondname中。使用+运算符连接firstname和secondname,并将结果存储在names[i]中,它是names数组中当前未使用的元素。
在循环中最后读入年龄字符串,并将结果存储在ages[i]中。for循环将条目数限制为count,它对应于数组中的元素个数。如果没能成功地结束循环,数组在显示一条消息(表明已经输出了所输入的数据)后就满了。