2013-01-02 44 views
3

我是C++的新手,正在通過一本書工作,並正在學習一些偉大的東西。但是,我嚴重陷於其中一個練習中,我無法確定這個原理。使用C++ 11範圍替換字符串中的所有字符

該問題要求我使用新的範圍對於聲明將字符串中的所有字符(「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天,現在想出這個簡單的事情。任何幫助將不勝感激!

+0

我敢肯定'algorithm'具有算法這一點。 –

+4

@WaleedKhan:如果練習的要點是使用範圍-for語句,雖然... –

+2

也許我不明白這個問題,但如果我這樣做了,難道你不能只是將'c = toupper(c) '用'c ='X''? –

回答

8

一個簡單的任務應該工作:

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

+0

真棒!謝謝你 – user1942453

2

你的代碼給出了正確的輸出,但是並沒有做正確的事情。它打印X的,但不會更改字符串。

循環中的迭代變量(initChange)是對字符串(字符)元素的引用;每個迭代,它指向字符串中的下一個字符。您可以使用此引用來修改字符字符串(就像toupper()例子一樣)中:

string initial ("Hello World!"); 
for (auto &initChange : initial) 
    initChange = 'X'; 
cout << initial; //verify the original string is changed 
相關問題