循环未正确操作

时间:2012-06-03 06:38:35

标签: c++

这是我的代码在这里我试图在“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;
}    

2 个答案:

答案 0 :(得分:1)

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

正在发生的事情是scanf在读完int后停止解析。它不会消耗您键入的行尾字符,也不会消耗您在该号码后输入的任何其他内容。所以getline选择第一行剩下的东西(可能只是换行符) 一个“快速”但又脏的修复方法是更改​​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++?,答案演示了分割字符串的方法,这些字符串比您在此处所做的更不容易出错。

答案 1 :(得分:1)

你是如何完全进入的?我认为问题可能是你的getline()正在读取流的最后一个[enter],因此自动将一个空字符串放入s中。这将导致你得到1。试试你的scanf:

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

那应该吸收[enter]。