练习3.6
写一段程序,使用范围for语句将字符串内所有字符用X代替。
解答:
#include <iostream>
using namespace std;
int main(){
char str[] = "hello, world";
for (size_t i = 0, len = strlen(str); i != len; ++i){
str[i] = 'X';
}
cout << str << endl;
}
#include <iostream>
#include <string>
using namespace std;
int main(){
string str = "hello, world!";
for (auto &i : str){
i = 'X';
}
cout << str << endl;
}
练习3.7
就上一题完成的程序而言,如果将循环控制变量的类型设为char将发生什么?先估计一下结果,然后实际编程进行验证。
解答:
#include <iostream>
int main(){
char str[] = "hello, world";
for (char *ch = str ;*ch != '\0'; ++ch){
*ch = 'X';
}
std::cout << str << std::endl;
}
练习3.8
分别用while循环和传统的for循环重写第一题的程序,你觉得那种形式更好呢?为什么?
解答:
#include <iostream>
#include <string>
using namespace std;
int main(){
string str = "hello, world";
for (auto it = str.begin(); it != str.end(); ++it){
*it = 'X';
}
std::cout << str << std::endl;
}
#include <iostream>
#include <string>
using namespace std;
int main(){
string str = "hello, world";
auto it = str.begin();
while (it != str.end()){
*it = 'X';
++it;
}
std::cout << str << std::endl;
}
个人而言更喜欢for的方式,能让代码更简短,更易读。
练习3.9
下面的程序有何作用?它合法吗?如果不合法,为什么?
string s;
cout << s[0] << endl;
解答:
这样的代码是合法的。
这段代码的作用…… 应该是验证默认值是否为空吧(个人理解)。
练习3.10
编写一段程序,读入一个包含标点符号的字符串,将标点符号去除后输出字符串剩余的部分。
解答:
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
using namespace std;
string foo(string& str){
auto pend = str.end();
pend = remove_if(str.begin(), pend, ispunct);
return string(str.begin(), pend);
}
int main(){
string str = "hello, world!";
cout <<foo(str) << endl;
}
当然这里也可以采用for循环逐个字符进行分析,当满足条件的时候进行输出。
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main(){
string str = "hello, world!";
for (string::size_type i = 0; i < str.size(); ++i){
if (!ispunct(str.at(i))){
cout << str.at(i);
}
}
cout << endl;
}
练习3.11
西面的范围for语句合法吗?如果合法,c的类型是什么?
const string s = "Keep out!";
for(auto &c:s) {/*...*/}
解答:
合法,c在这里肯定是const char&类型。