我是C ++的新手,通过一本书来学习并学习一些很棒的东西。但是,我严重依赖其中一个练习,我无法理解这个原则。
这个问题要求我使用新的范围语句将字符串中的所有字符(“Hello World”)更改为字母X.
通过输入以下代码,我成功获得了正确的输出:
string initial ("Hello World!");
for (auto &initChange : initial)
cout << "X";
但是我知道这个代码远非正确,因为一个例子是将同一个字符串中的所有文本更改为大写使用以下内容:
string s("Hello World!!!");
for (auto &c : s)
c = toupper(c);
cout << s << endl;
我理解这段代码,但我无法将其变体用于练习。
我现在已经把头发拉了两天才发现这个简单的事情。任何帮助将不胜感激!
答案 0 :(得分:9)
简单的作业应该有效:
std::string initial ("Hello World!");
for (auto& c: initial) {
c = 'X';
}
std::cout << initial << '\n';
请注意c = "X"
无法使用,因为"X"
类型为char const[2]
(退化为char const*
)而c
类型为char
}。 'X'
具有相应的类型:char
。
答案 1 :(得分:2)
您的代码提供了正确的输出,但没有做正确的事情。它会打印X,但不会更改字符串。
循环中的迭代变量(initChange
)是对字符串元素(字符)的引用;每个iteraton,它引用字符串中的下一个字符。您可以使用此引用来修改字符串中的字符(就像toupper()
示例所做的那样):
string initial ("Hello World!");
for (auto &initChange : initial)
initChange = 'X';
cout << initial; //verify the original string is changed