我正在创建这个启发字符串App,但如果我在字符串中包含空格,我会收到错误!
#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
}
如果我输入以下字符串,如&#34; abc def&#34;我得到一个错误。但除此之外它完美无缺!这些代码有些错误!我是CPP的新手,所以如果你能帮助我会有所帮助!
答案 0 :(得分:4)
运营商GT;&GT;将停止在第一个空间阅读(正如大卫指出的那样) - 改用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);
}
}
包括David的逐字答案,因为他回答了更多细节(DavidRodríguez - dribeas) - 请在删除之前给他+1。他的回答增加了我没有提到的更多信息,所以我们将这个问题合并到Davids请求的单一回复中,
Adrian的答案是正确的,处理当前问题并提供解决方案。至于为什么它进入无限循环,原因是在读完第一个单词后,你试图读取整数std::cin >> inputa
,这将失败,因为cde
不能被解析为整数。此时,流进入失败状态,后续读取将失败而不执行任何操作(直到您清除错误状态)。
你应该怎么做?
如果您想处理整行,则应使用std::getline
,而不是operator>>
。注意混合两者,作为运算符&gt;&gt;读取后不会占用空格(包括新行),您可能只读取下一行std::getline
的空行。您可以随时使用std::getline
阅读,然后解析该行,或使用ignore
清除换行符。最后,无论何时执行IO操作,都不要指望操作成功:检查流的状态。如果你没有,并且你的循环依赖于IO来完成,那么很容易进入这种无限循环,其中流被标记为失败,后来的读取都没有成功,你永远不会脱离循环。