2015-09-29 100 views
1

我需要製作一個程序,它連續讀取n數字。舉例來說,用戶首先將在2號的列表如下:連續閱讀直到控制檯中的換行符

P n

我設法讀那些scanf但現在我需要閱讀n下面的數字,這些數字在連續給如下。

1 6 3 99 ... n times 這些數字必須一次全部讀出(或給出印象)。

我已經嘗試過使用

while(getline(cin,str)){ 
// do something with str 
} 

this thread解釋,但我需要while循環中的動作停止時,我打了前奏關鍵。在我目前的實施中,他們不會停下來,它只是在等待更多的線路閱讀。

總結: 首先,用戶必須能夠輸入兩個數字(Pn)(完成!),然後按下回車鍵開始輸入n號碼列表(未完成!)。

這是我的代碼。

#include <iostream> 
#include <string> 
#include <sstream> 

using namespace std; 
int main(void){ 
    int P,n; 
    scanf("%d %d",&P,&n); 
    string val; 
    int score[P]; 
    int i; 
    for(i=0;i<P;i++){ 
     score[i]=0; 
    } 
    while(getline(cin,val)){ 
     printf("Val=%s\n",val.c_str()); 
     stringstream stream(val); 
     int local; 
     while(stream >> local){ 
      score[local]=score[local]+1; 
      printf("%d-%d\n",local,score[local]); 
     } 

    } 
    for(i=0;i<P;i++){ 
     printf("%d-%d\n",i,score[i]); 
    } 
    return 0; 
} 
+0

您是否需要明確退出閱讀模式? – victor

+0

我不明白你想說什麼,但我只需要在最後打印得分數組。 –

+0

用戶輸入P n並點擊輸入。然後他鍵入1 2 3 4 5,然後按回車。在這一點上,你是否希望用戶能夠輸入其他數字,或者你想讓閱讀停止? – victor

回答

1

在n次循環內使用scanf()而不是getline()。

for(int i = 0; i < n; i ++){ 
    scanf("%d",&variable); 
} 
+0

這不需要我每次都按下簡介讓循環繼續下一次掃描嗎? –

+0

不, 例如:假設,n = 5,然後 1 2 3 4 5(然後輸入press,循環將停止,單次輸入press atlast) –

1

不知道我明白你的問題,但是這段代碼會讀出2個數字,然後是一行然後結束。

using namespace std; 

int main(){ 
    int P,n; 

    cin >> P; 
    cin >> n; 

    int *score = new int[P]; 

    for(int i=0;i<P;i++){ 
     score[i]=0; 
    } 

    int num; 

    string val; 

    cin.ignore(); 
    getline(cin, val); 

    istringstream stream(val); 

    while (stream >> num) { 

     printf("Val = %d\n", num); 

     score[num]=score[num]+1; // potential segmentation fault here in your code 

     printf("%d-%d\n",num,score[num]); 
    } 

    delete [] score; 

    return 0; 

}

因爲你假設上線的數量大於P,其是陣列的尺寸會發生故障。但是,下面的輸入會導致錯誤:

1 2 5

0

這個問題幾乎是一個經典之作。經典的問題有這樣的代碼:

cin >> n; 
getline(cin, s); 

然後筆者疑惑,爲什麼s是空的。你的變體也是如此,儘管它也使用C stdio函數來使事情更加混亂。問題在於第一個調用是基於字段的輸入,它將讀取一個值n並在緩衝區中保留任何其他輸入!如果用戶輸入42並按回車鍵,則剩餘的輸入是換行符。第二個getline()調用然後讀取一個空字符串並丟棄換行符。

對於與用戶的交互,只使用getline(),然後嘗試解析每一行。使用stringstream s或sscanf(),因爲您看起來很熟悉,都是有效的選項。然而,如果你只想讀取輸入並不真正相互作用,David Weston的建議也是一個很好的建議,也可能是最簡單的建議。但是,由於您使用的是C++,我建議使用cin >> variable