2015-11-09 77 views
0

此處的此代碼用於反轉字符串中的字。問題是它只能反轉字符串中的第一個單詞。當我跑過蹤跡時,發現它在遇到語句後停止了。if(s[indexCount] == '\0') break;字符串中的反轉字

爲什麼每當第一個單詞逆轉時,即使其他字符出現在第一個單詞後面,代碼也會變爲空字符。

#include <iostream> 
using namespace std; 
int main() 
{ 
    string s; 
    char tchar; 
    int indexCount=0,charCount=0,wordIndex; 
    cin>>s; 
    while(1){ 
     if(s[indexCount]==' ' && charCount==0) continue; 
     if(s[indexCount]==' ' || s[indexCount]=='\0'){ 
      wordIndex=indexCount-charCount; 
      charCount=indexCount-1; 
      while(charCount!=wordIndex && charCount>wordIndex){ 
       tchar=s[wordIndex]; 
       s[wordIndex]=s[charCount]; 
       s[charCount]=tchar; 
       charCount--; 
       wordIndex++; 
      } 
      if(s[indexCount] == '\0') break; 
      indexCount++; charCount=0; 
     } 
     else{ 
      charCount++; 
      indexCount++; 
     } 
    } 
    cout<<"\nReveresed words in the string : \n\t"<<s<<endl; 
    return 0; 
} 

另外我使用的是while(1)。它是否使這是一個錯誤的代碼?

+0

您可能想要將其更改爲'while(true)'。我不會說它是「壞」,但如果可以的話,你應該在「while」條款中加入一個明確的條件。這樣,當你看到循環時,它說明了循環操作的條件。 –

+0

對於哪些輸入您收到不良結果? – fghj

+0

反轉整個字符串和反轉字符串中的單詞有什麼區別? –

回答

0

問題的確在於輸入方法。 cin >> string_variable將認爲空格是分隔符。這就是爲什麼只有第一個字被輸入。將cin >> s;替換爲getline(cin, s);,它將正常工作。

0

首先我要指出的是,

cin >> stringObject; 

永遠不會讀空格字符的!所以插入My name is geeksoul將導致上面的代碼只讀取My並將其他所有內容保留在緩衝區中!

要閱讀的空格字符,你應該使用這樣

std::getline(std::cin, stringObject); 

read about getline

The standard doesn't say that in case of an std::string '\0' is any special character. Therefore, any compliant implementation of std::string should not treat '\0' as any special character. Unless of course a const char* is passed to a member function of a string, which is assumed to be null-terminated.

getline功能如果你真的想檢查與空終止字符的字符串,那麼你應該考慮使用stringObject.c_str()它將C++風格的字符串轉換爲舊式C風格的字符串!

Check this for c_str

最後this可能對你有所幫助!

+0

[This](http://stackoverflow.com/a/6077274/4756309)答案表示提問者的代碼將按照預期的方式工作,即空終止。 –

+0

@JamesRoot但重點是將std :: string將始終以''\ 0''結束,答案是否定的! – Deepanshu

+0

該答案中的評論線程也解釋了它。首先,在這種情況下,它實際上是否存儲在內存中並不重要,因爲提交者不試圖用其中的'\ 0'修改索引。其次,'operator []'返回與'c_str'相同數據的引用,所以必須有一個空終止字符。但是,這是假設C++ 11。 –

0

快速提示。 如果反轉整個字符串中的所有字符,然後反轉每對連續空格之間的所有字符,則可以通過簡單代碼實現相同的結果,如下所示:(請注意,這可能不會編譯或略有錯誤(避難所沒有編譯或任何東西),但應該傳達基本思想)

void reverseWords(std::string& aString) { 
    std::reverse(aString.begin(), aString.end()); 
    size_t lastSpaceIndex = 0; 
    for (size_t index = 0; index != aString.size(); ++index) { 
     if (aString[index] == ' ') { 
      std::reverse(aString.begin() + lastSpaceIndex + 1, aString.begin() + index); 
      lastSpaceIndex = index; 
     } 
    } 
}