3

我是 C++ 新手,正在阅读一本书,并且正在学习一些很棒的东西。但是,我严重卡在其中一项练习上,无法弄清楚原理。

这个问题要求我使用新的Range For语句将字符串(“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;

我理解这段代码,但我无法得到它的变体来实现练习的目的。

我已经拉了两天的头发来弄清楚这个简单的事情。任何帮助将不胜感激!

4

2 回答 2

9

一个简单的任务应该可以工作:

std::string initial ("Hello World!");
for (auto& c: initial) {
    c = 'X';
}
std::cout << initial << '\n';

请注意,这c = "X"将不起作用,因为"X"is 类型char const[2](退化为char const*)而c类型char'X'具有适当的类型:char.

于 2013-01-02T09:49:17.360 回答
2

您的代码给出了正确的输出,但没有做正确的事情。它打印 X,但不更改字符串。

循环中的迭代变量 ( initChange) 是对字符串元素(一个字符)的引用;每一次迭代,它都指向字符串中的下一个字符。您可以使用此引用来修改字符串中的字符(就像toupper()示例一样):

string initial ("Hello World!");
for (auto &initChange : initial)
  initChange = 'X';
cout << initial;  //verify the original string is changed
于 2013-01-02T09:50:30.747 回答