2011-11-08 96 views
1

我是一個初學者,我一直在閱讀一本關於C++的書,並且我正在寫一篇關於函數的章節。我寫了一個反轉字符串,將它的一個副本返回給main並輸出它。從C++函數返回一個字符串

string reverseInput(string input);

int main() 
{ 
    string input="Test string"; 
    //cin>>input; 
    cout<<reverseInput(input); 
    return 0; 
} 

string reverseInput(string input) 
{ 
    string reverse=input; 
    int count=input.length(); 
    for(int i=input.length(), j=0; i>=0; i--, j++){ 
     reverse[j]=input[i-1]; 
    } 
    return reverse; 
} 

以上似乎工作。

string input="Test string"; 

到:當我改變下面的代碼出現該問題

string input; 
cin>>input; 

此更改後,反向函數返回,而不是整個字符串只有第一輸入的單詞的反向。我無法弄清楚我錯在哪裏。

最後,有沒有一種更優雅的方式來做到這一點,通過使用引用,而不做一個輸入的副本,以便輸入變量本身被修改?

+0

你的反向函數有一個bug。你應該使用'i> 0'作爲'for'的條件。在最後一次迭代'i == 0'和'j == input.length()'導致'reverse [input.length()] = input [-1]',這兩者都超出了界限。 – IronMensan

回答

4

cin >> input讀一個字。要閱讀一整行,你應該使用函數getline

getline(cin, input); 

調試器在這個情況下是非常有用的,你可以只看到變量步進通過程序的值。

A simple cout < < input;也會幫助你,但如果你還沒有一個好的集成調試器的IDE,我會建議你使用一個。 Eclipse是很好的開源軟件。如果你在windows上,Visual Studio 2010 express是很好的免費的。

+0

感謝您的意見。我將開始使用調試器。 – Zubizaretta

4

cin>>input;讀一個字,而不是一行。

使用例如getline(cin, input);讀一行

0

這不是您的反向函數中的錯誤,而是istream::operator>>的標準行爲,它只讀取第一個空白字符。

1

就地反轉功能已經回答了在這裏詳細:

How do you reverse a string in place in C or C++?

+1

這對他的情況沒有幫助,因爲他仍然錯誤地讀取了字符串。 –

+0

同意,但只得到第一個字已被回答幾次:-) – pointer

+0

對不起,我重讀他明確要求一個就地版本。 –

1

與您的代碼的問題是,std::cin讀取字符,直到它遇到一個字符,其std::isspace(c)回報true。所以空格和換行符都是這樣的字符,當傳遞到std::isspace時返回true

所以,你需要什麼主要是,std::getline

std::string input; 
if (std::getline(std::cin, input)) 
{ 
    std::cout << reverseInput(input); 
} 
else 
{ 
    std::cout <<"error while reading from standard input stream"; 
} 
0

您需要使用cin.getline(),CIN >> S將只讀取第一個字(用空格分隔)

1

由於爲您的參考和複製的問題:

string& reverseInput(string& input) 
{ 
    for (i = 0, j = input.length()-1; i < j; i++, j--) 
    { 
     char c = input[i]; 
     input[i] = input[j]; 
     input[j] = c; 
    } 
    return input; 
} 

您傳遞您的參數作爲參考,並且您返回一個引用。不涉及複製,並且在一個正文中,您沒有定義任何新字符串,您正在處理同一個實例。