3

私はC++を初めて使用し、本を読み進めて、すばらしいことを学んでいます。しかし、私は演習の1つに真剣に取り組んでおり、原則を理解できません。

この質問では、新しい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;

私はこのコードを理解していますが、演習の目的で機能するようにそのバリエーションを取得することはできません。

この簡単なことを理解するために、私は2日間髪を抜いてきました。どんな助けでも大歓迎です!

4

2 に答える 2

9

簡単な割り当てが機能するはずです。

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

はタイプ(に縮退)であるのに対し、はタイプであるc = "X"ため、機能しないことに注意してください。適切なタイプがあります:。"X"char const[2]char const*cchar'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 に答える