这是我在这里的代码,我试图一次找到最大长度的相同长度字符,例如“ 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;
}

最佳答案

您不应该将scanfgetline混合使用,尝试仅使用其中一个(而getline是更好的选择)。

发生的情况是scanf一旦完成读取int就会停止解析。它不会占用您键入的行尾字符,也不会消耗您在该数字之后输入的任何其他字符。因此,getline提取第一行中剩下的所有内容(可能只是换行符char)。
一个“快速”但肮脏的解决方法是更改​​您的scanf调用,以使其在int之后吞下空白:

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


但这不是真正的解决办法。使用getline和字符串流(在<sstream>中)获取第一个数字,您的代码将按预期工作。您可以在以下常见问题解答中找到使用istringstream提取数字的示例:How to convert a number to string and vice versa in C++

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

关于c++ - 循环操作不正确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10868417/

10-12 03:54
查看更多