0

这是我的代码,我试图一次找到最大长度的相同长度字符,例如“ a a a bb bb bc sa sa a a”,所以答案是 5 一次两个字符,相邻 5 次。

这是我的代码,我的问题是,当我尝试输入时,对于我的第一个输入,它不会是 getline 而是 printf 在最后几行,然后它需要一行并打印输出

就像我给5它写1然后它需要getline,但我希望它首先使用getline而不是printf,这样对于我的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

您不应该与 混合scanfgetline尽量只使用其中一种(这getline是一个更好的选择)。

正在发生的事情是,scanf一旦完成读取int. 它不会占用您键入的行尾字符,也不会占用您在该数字之后输入的任何其他内容。所以getline拿起第一行剩下的任何东西(可能只是换行符)。
一个“快速”但肮脏的解决方法是更改​​您的scanf调用,以便它在以下内容之后吞下空格int

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

但这不是一个真正的解决办法。使用getline和字符串流 (in <sstream>) 来获取第一个数字,您的代码将按照您的预期工作。您将istringstream在此常见问题解答中找到使用 提取数字的示例:如何在 C++ 中将数字转换为字符串,反之亦然

您可能还对另一个问题感兴趣: Split a string in C++? ,答案演示了拆分字符串的方法,这些方法比您在此处所做的更不容易出错。

于 2012-06-03T07:07:18.453 回答
1

您如何准确输入所有内容?我认为问题可能是您的 getline() 正在从流中读取您的最后一个 [enter],因此会自动将一个空字符串放入 s. 这将导致您得到 1 。试试这个你的scanf:

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

那应该吸收[进入]。

于 2012-06-03T07:07:43.893 回答