2012-11-22 80 views
4

給定的輸入樣被得到:忽略行的其餘部分一旦輸入已用C

6 2 
1 2 3 4 5 6 
4 3 3 4 5 6 

凡在 第一行第一數目的在行變量數,第二個是行數。 如何才能獲得第一個n/2值,其中n是一行中的值的數量並跳到下一行?

+0

你能說說嗎?問題不清楚,你想要什麼類型的int或char或所有類型 – Omkant

+0

im需要的類型是Int – asnewbie

+3

提前不知道'n',你不能讀取n/2項* only *,不能超過當我告訴你這是我妻子的一半時,你可以確信我的侄女年齡。你需要知道'n',並且由於'n'是(linelength-1)/ 2來計算結束換行符,所以你需要讀取整行。您選擇保留的*相關*數據完全取決於您。 – WhozCraig

回答

3

我很驚訝,沒有人提到fscanf("%*d") - 這*符號告訴fscanf讀取一個整數值,但忽略它(請參閱文檔here)。這可以讓你做這樣的事情:

int numbers[MAX_NUMS]; 
int n = numbers_in_line(); 
for(i = 0; i < n; i++) 
    if(i<n/2) 
     fscanf("%d", &numbers[i]); 
    else 
     fscanf("%*d"); 

這似乎比剛剛閱讀其餘的字符更清晰。如果你知道n時間提前,你也可以這樣寫:

scanf("%d %d %d %*d %*d %*d",&numbers[0],&numbers[1],&numbers[2]); 

你並沒有直接問這個,但如果你在讀二進制數據,有跳過行的其餘部分的另一種方式。你可以讀取你想要的數據,然後計算下一行開頭的位置(這裏有一些指針算術),並使用fseek函數跳轉到該位置,這可以節省一些I/O時間。不幸的是,你不能用ASCII數據來做這件事,因爲這些數字不佔用統一的空間。

0

以前,你知道一行中有多少個數字嗎?如果你的答案是肯定的,我建議你試試這個:

int n = numbersInALine(); 
int i = 0; 
int *numbers = (int*) malloc(sizeof(int) * (n/2)); 
for(i = 0; i < n/2; i++) 
    scanf("%d", &numbers[i]); 
4

如果輸入長度不改變(例如,6號喜歡你的例子),你可以使用讀取所需的輸入:

scanf("%d %d %d", ...); 

然後,處理輸入的其餘部分:

while ((ch = getchar()) != '\n' && ch != EOF); 

如果輸入長度確實變化,你必須把它讀入緩衝區。然後,您可以迭代字符串以查找其中的空格數(So n = spaces + 1),然後使用strtok n/2次再次迭代以獲得前n/2個數字。

+0

可能值得注意的是,在你的第一個代碼片段中的'...'並不意味着'...',而是「你的變量在這裏」。 –

相關問題