1

この改訂文字列アプリを作成していますが、文字列にスペースを含めるとエラーが発生します!

#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>> は最初のスペースで読み取りを停止します (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してください。彼の回答には、私が言及しなかった多くの情報が追加されているため、David の要請により、これを 1 つの回答にまとめています。

エイドリアンの答えは正しく、差し迫った問題に対処し、解決策を提供します。無限ループに入る理由については、最初の単語を読み取った後、整数を読み取ろうとしているが、整数として解析できないためstd::cin >> inputa失敗するためです。cdeこの時点で、ストリームは失敗状態になり、後続の読み取りは何もせずに失敗します (エラー状態をクリアするまで)。

あなたは何をするべきか?

行全体を処理したい場合はstd::getline、 ではなく ,を使用する必要がありますoperator>>。operator>> は読み取り (改行を含む) の後にスペースを消費せず、次のstd::getline. 常に行を読み取ってstd::getlineから解析するかignore、改行までクリアするために使用できます。最後に、IO 操作を実行するときはいつでも、操作が成功することを期待しないでください。ストリームの状態を確認してください。そうしないと、ループが完了するために IO に依存している場合、ストリームが失敗としてマークされ、その後の読み取りが成功せず、ループから抜け出すことができない、この種の無限ループに入るのは非常に簡単です。

于 2012-08-30T01:38:05.230 に答える