2012-06-03 57 views
0

这是我在这里的代码,我想找到的相同长度的字符最大长度,如“a a a bb bb bc sa sa a a”所以答案是在时间相邻5次5两个字符的时间。循环无法正常运行

这是我的代码,我的问题是,当我试图把输入,我的第一个输入它不会函数getline但printf的在最后几行,然后它需要一条线,并打印输出

就像如果我给 5写入1,那么它需要函数getline,但我想它采取函数getline第一,而不是printf的,以这种方式为我的5个输入它打印。我想5所希望你能告诉我为什么1个4所希望输出..

#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; 
}  

回答

1

你不应该与getline混合scanf,尽量只使用一个或T他其他的(和getline是一个更好的选择)。

发生什么事是scanf一旦完成读取int就停止解析。它不消耗行字符键入,或其他任何东西,你可以说数后已进入结束。所以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++

您可能也有兴趣在此的其他问题: Split a string in C++?,答案演示的方式来分割字符串容易出错小于你在这里做什么。

1

你如何准确地输入一切?我认为问题可能是你的getline()正在读取你最后一个[输入]的流,从而自动将一个空字符串放入s中。那会导致你得到的1。试试这个你scanf函数:

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

这应该吸收[进入]。