2012-08-30 131 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++,不明白你的方法。 –