2012-08-30 159 views
2

我正在創建這個revese字符串應用程序,但我得到一個錯誤,如果我在字符串中包含空格!反向字符串錯誤?

#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    int inputa; 
    cout<<"%%%%%%%%%%%%%%%%%%String Reversing App%%%%%%%%%%%%%%%%%%%%%%%%"<<endl<<endl; 

    cout<<"\nEnter 1 to continue and 0 to exit"<<endl<<endl; 
    cin>>inputa; 
    if(inputa!=0) 
    { 

     do 
     { 

      string a,c=""; 

      cout<<"\nEnter the string you want to Reverse : "; 
      cin>>a; 
      for(int x=a.length()-1; x>=0; x--) 
      { 
       c=c+a.substr(x,1); 
      } 

      cout<<"\nThe Reverse String is : "<<c<<endl; 

      cout<<"\nEnter 1 to continue and 0 to exit"<<endl<<endl; 
      cin>>inputa; 



     } 
     while(inputa!=0); 
    } 
//not my home work 
} 

如果我輸入像「abc def」這樣的字符串,那麼出現錯誤。但是,否則它完美的作品!代碼有一些錯誤!我是CPP新手,所以如果你能幫助我的話,這將會有所幫助!

+1

爲什麼不在'算法'庫中使用'std :: reverse'? – Rapptz

+1

你得到的錯誤是什麼? –

+0

@Scott Hunter我有時會得到一個無限循環,而下一次有其他的事情! –

回答

4

操作>>將停在第一空間讀取(如大衛指出的) - 使用函數getline代替

std::string a; 
getline(std::cin, a); 

代碼的全部編輯

#include <iostream> 
#include <string> 
#include <limits> 

int main() 
{ 
    std::cout << "%%%%%%%%%%%%%%%%%%String Reversing App%%%%%%%%%%%%%%%%%%%%%%%%\n\n"; 

    std::cout << "\nEnter 1 to continue and 0 to exit" << std::endl; 
    int inputa; 
    std::cin >> inputa; 
    if(std::cin && inputa!=0) 
    { 
     std::cin.ignore(std::numeric_limits<int>::max(), '\n'); 
     do 
     { 
      std::string a,c; 

      std::cout<<"\nEnter the string you want to Reverse : "; 
      getline(std::cin, a); 
      for(int x=a.length()-1; x>=0; --x) 
      { 
       c+=a[x]; 
      } 

      std::cout<<"\nThe Reverse String is : " << c << std::endl; 

      std::cout << "\nEnter 1 to continue and 0 to exit" << std::endl << std::endl; 
      std::cin >> inputa; 
      std::cin.ignore(std::numeric_limits<int>::max(), '\n'); 
     } 
     while(std::cin && inputa!=0); 
    } 
} 

包括大衛的逐字答案,因爲他回答更詳細的信息(DavidRodríguez - dribeas) - 請在刪除它之前給他+1。他的回答增添了更多的信息,我並沒有提及,所以我們這個合併成戴維斯請求的單一答覆,

由阿德里安的答案是正確的,涉及的是直接的問題,並提供瞭解決方案。至於爲什麼它進入一個無限循環,原因是讀完第一個單詞後,您試圖讀取一個整數std::cin >> inputa,這將失敗,因爲cde不能被解析爲整數。此時流將進入失敗狀態,隨後的讀操作將會失敗,直到您清除錯誤狀態爲止。

你應該怎麼做?

如果你想處理整行,那麼你應該使用std::getline,而不是operator>>。小心混合兩者,因爲操作員>>在讀取後不會消耗空間(包括新行),並且您可能只是閱讀下一個std::getline的空行。您可以始終使用std::getline進行讀取,然後解析該行,或使用ignore清除換行符。最後,無論何時執行IO操作,都不要期望操作成功:請檢查流的狀態。如果你不這樣做,而你的循環依賴於IO來完成,那麼進入這種無限循環是非常容易的,在這種循環中,流被標記爲失敗,不會稍後讀取成功,並且你永遠不會跳出循環。

+1

你的意思是'操作>>(的std :: string&)','不是的std :: cin'下一次。 –

+0

好一點 - 將編輯 –

+0

爵士可我知道在哪裏添加在program.i這些陳述是新的C++,不明白你的方法。 –