1

我正在创建这个 revese 字符串 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
}

如果我键入以下字符串,例如“abc def”,则会出现错误。但除此之外它完美无缺!代码有没有错误!我是 CPP 的新手,所以如果你能帮助我会很有帮助!

4

1 回答 1

4

operator>> 将在第一个空格处停止阅读(正如大卫指出的那样) - 改用 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);
    }
}

包括大卫的逐字回答,因为他回答得更详细(大卫罗德里格斯 - dribeas) - 请在他删除之前+1他。他的回答增加了我没有提到的更多信息,因此我们应戴维斯的要求将其合并为一个回复,

Adrian 的回答是正确的,解决了眼前的问题并提供了解决方案。至于为什么会进入死循环,原因是读完第一个词后,你试图读一个整数std::cin >> inputa,会失败,因为cde不能解析为整数。此时流进入失败状态,后续读取将失败而无需执行任何操作(直到您清除错误状态)。

你该怎么办?

如果要处理整行,则应使用std::getline,而不是operator>>. 小心混合两者,因为 operator>> 不会消耗读取后的空格(包括新行),并且您可能只是读取带有 next 的空行std::getline。您可以始终阅读std::getline并解析该行,或使用ignore清除换行符。最后,无论何时执行 IO 操作,都不要期望操作成功:检查流的状态。如果你不这样做并且你的循环依赖于 IO 来完成,那么很容易进入这种无限循环,其中流被标记为失败,以后读取不会成功并且你永远不会跳出循环。

于 2012-08-30T01:38:05.230 回答