反向字符串错误?

时间:2012-08-30 01:34:22

标签: c++ string substring

我正在创建这个启发字符串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的新手,所以如果你能帮助我会有所帮助!

1 个答案:

答案 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来完成,那么很容易进入这种无限循环,其中流被标记为失败,后来的读取都没有成功,你永远不会脱离循环。