0

これは私のコードです " a a a bb bb bc sa sa a a" のように一度に同じ長さの文字の最大長を見つけようとしているので、答えは一度に 2 文字で 5 回、隣接して 5 です。

これは私のコードです。私の質問は、入力を取得しようとしているときに、最初の入力では行を取得するのではなく、最後の行で printf を実行し、行を取得して出力を出力することです。

たとえば、5 を指定すると 1 が書き込まれ、次に getline が必要ですが、printf ではなく getline を最初に取得したいのですが、このようにして、5 つの入力に対して 1 と 4 つの必要な出力が出力されます。5 が必要な理由を教えてください。 .

#include<iostream>
#include<cstdio>
#include<vector>

using namespace std;

int main()
{
    int a,j;
    scanf("%d",&a);
    for(j=0;j<a;j++)
    {
        vector<int> v;
        string s;
        getline(cin,s);

        int i,cnt =0;
        for(i=0;i<s.length();i++)
        {

            if(s[i] != ' ')
            {
                cnt++;
            }
            else
            { 
                v.push_back(cnt);
                cnt =0;
            }
        }
        v.push_back(cnt);

        int k=0;
        int ps =0;
        int sp=0;

        while(k<v.size()-1)
        {
            if (v[k+1] - v[k] == 0)
            {
                sp++;
                k++;
            }
            else
            if (sp >= ps)
            {
                ps = sp;
                 k++;
                sp=0;
            }
            else
            {
                k++;
                sp=0;
            }
        }
        if (sp<ps)
        printf("%d",ps+1);
        else
        printf("%d",sp+1);
    }

    return 0;
}    
4

2 に答える 2

1

scanfと混ぜてはいけません。getlineどちらか一方のみを使用してください (getlineより良いオプションです)。

何が起こっているかというとscanfint. 入力した行末文字や、その番号の後に入力できたその他の文字は消費されません。そのgetlineため、その最初の行に残っていたもの (おそらく改行文字だけ) を取得します。
「迅速な」が汚い修正は、scanf呼び出しを変更して、 の後の空白を飲み込むことintです。

scanf("%d ",&a);
      // ^ notice the space there

しかし、それは本当の修正ではありません。getlineおよび文字列ストリーム ( 内) を使用し<sstream>て最初の数値を取得すると、コードは意図したとおりに機能します。を使用して数値を抽出する例についてはistringstream、FAQ: How to convert a number to string and vice versa in C++ を参照してください。

この他の質問にも興味があるかもしれません: C++ で文字列を分割しますか? 、答えは、ここで行っていることよりもエラーが発生しにくい文字列を分割する方法を示しています。

于 2012-06-03T07:07:18.453 に答える
1

どのようにすべてを正確に入力していますか? 問題は、getline() が最後の [enter] をストリームから読み取っているため、自動的に空の文字列が s に入れられていることだと思います。それはあなたが得ている 1 になります。あなたのscanfのためにこれを試してください:

scanf("%d\n",&a)

それは[入力]を吸収するはずです。

于 2012-06-03T07:07:43.893 に答える