2016-12-26 37 views
0

我需要一些幫助來調試我的代碼。此代碼旨在將字符串中的單詞轉換爲句子形式[假設該字符串沒有「。」。最後]。出於某種原因,我得到的輸出是縮進的輸出,在第一個單詞之後加上一個額外的空格以及縮進的輸出減去第一個單詞。我是編碼方面的初學者;所以如果可能的話,我希望更易於理解的解決方案,或者使用循環,字符串和數組的解決方案。需要幫助調試我的代碼,以反轉字符串中的單詞

樣品輸入:

My name is Edward 

預期輸出:

Edward is name My 

輸出接收:

Edward is name 

這裏是我到目前爲止的代碼:

#include <iostream> 
#include <string> 
#include <stdio.h> 

using namespace std; 

int main() { 

string s, n, a; 
getline(cin, s); 

for (int i = s.length(); i >= 0; i--){ 
    if (s[i] != 32) { 
     n += s[i]; 
    } 
    else { 
     for (int j = n.length() -1; j >= 0; j--){ 
      a += n[j]; 
     } 
     cout << a << ' '; 
     n.clear(); 
     a.clear(); 
    } 
} 

cin.ignore(); 
getchar(); 
return 0; 

} 

另外,我剛剛注意到最後還有一個額外的空間。如果有辦法可能取消輸出最後一個空格;請告訴我。

感謝您的閱讀,感謝您的幫助。

+0

要反轉的話('的std :: string'變量)不是字符! –

+0

's [s.length()]'超出了範圍,這是您的外部循環開始的範圍。這是未定義的行爲,但在我的測試中,它讓'n'有一個null作爲第一個字符,然後被複制,等等。調試器可以幫助你很多,讓你逐步瀏覽每一行,看看操作影響你的變量。 –

+0

如果你修復了外循環中的界限錯誤,你的代碼主要起作用。問題在於你的'else'反轉了這個單詞,並且打印出來不會被最後一個單詞擊中,除非它以空格結束。考慮將內部循環分解爲它自己的函數,您可以在循環外用'n'調用來處理最終的單詞。 –

回答

0

編輯︰感謝您的意見和答案的幫助下,我解決了額外的空間問題,並在最後增加了一些東西,輸出最後的單詞。這不是完美的,但它的工作原理。 :)

#include <iostream> 
#include <string> 

using namespace std; 

int main() { 

string s, n; 
getline(cin, s); 

for (int i = s.length() -1; i >= 0; i--){ 
if (s[i] != 32) { 
    n += s[i]; 
} 
else { 
    for (int j = n.length() -1; j >= 0; j--){ 
     cout << n[j]; 
    } 
    cout << ' '; 
    n.clear(); 
} 
} 

for (int k = n.length() -1 ; k >= 0; k--) 
cout << n[k]; 

cin.get(); 
return 0; 

} 
5

正如我在評論中提及,你倒車的字符整個字符串,但您需要拆分單詞和反向:

#include <iostream> 
#include <string> 
#include <sstream> 
#include <vector> 
#include <algorithm> 

using namespace std; 

int main() { 

    string s, n; 
    getline(cin, s); 
    std::istringstream iss(s); 
    std::vector<string> words; 
    while(iss >> n) { 
     words.push_back(n); 
    } 

    std::reverse(words.begin(),words.end()); 

    for(auto word : words) { 
     std::cout << word << ' '; 
    } 

    getchar(); 
    return 0;  

} 

Live Demo

-1

可以使用strrev();函數,而不是全部您的for區塊。

+1

這不會按預期工作。 –

2

所以這實際上只是從πάντα ῥεῖ's excellent answer抽象的額外步驟。您可以使用istream_iteratorostream_iterator來進一步簡化您的代碼。

整個代碼回答你的問題可以歸結爲:

const vector<string> words{ istream_iterator<string>(cin), istream_iterator<string>() }; 

copy(crbegin(words), crend(words), ostream_iterator<string>(cout, " ")); 

Live Example

+0

今天我很抱歉缺乏選票。 _「πάνταῥεῖ的優秀答案」_讓我臉紅,謝謝。 –

+1

@πάνταῥεῖ大聲笑,我喜歡看到很好的C++答案。我喜歡upvote他們,並參考他們儘可能......我只是希望我看到更多* code *看起來像你和我的答案:J –