【问题标题】:Reverse String Error?反向字符串错误?
【发布时间】:2012-08-24 16:51:03
【问题描述】:

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

【问题讨论】:

  • 为什么不在algorithm 库中使用std::reverse
  • 您遇到的错误是什么?
  • @Scott Hunter 我有时会陷入无限循环,而下次会发生一些其他事情!
  • 循环可能是因为 cin 数据的解析在第一个空格处停止 - 剩下的内容将在下次读取

标签: c++ string substring


【解决方案1】:

operator>> 将在第一个空格处停止读取(正如 David 指出的那样) - 改用 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 的逐字回答,因为他回答得更详细(David Rodríguez - dribeas) - 请在他删除之前 +1 他。他的回答增加了我没有提到的更多信息,因此我们应大卫斯的要求将其合并为一个回复,

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

你应该怎么做?

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

【讨论】:

  • 你的意思是operator&gt;&gt;(std::string&amp;),而不是std::cin
  • 先生,我可以知道在程序中的何处添加这些语句。我是 C++ 新手,不了解您的方法。
  • 请不要叫我先生 ;-) 我没有被皇家统治者封为爵士 :-)
  • 对不起,我只有 16 岁,这是一个基本的尊重!
  • @R41nB0wM47r1z 不用担心 - 和你开玩笑说它对不同国家的意义。无论如何,这仍然不是我应得的。
猜你喜欢
  • 1970-01-01
  • 2021-03-15
  • 2011-12-03
  • 2018-11-26
  • 2010-09-06
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多