2012-06-03 59 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) 

這應該吸收[進入]。