給定的輸入樣被得到:忽略行的其餘部分一旦輸入已用C
6 2
1 2 3 4 5 6
4 3 3 4 5 6
凡在 第一行第一數目的在行變量數,第二個是行數。 如何才能獲得第一個n/2
值,其中n
是一行中的值的數量並跳到下一行?
給定的輸入樣被得到:忽略行的其餘部分一旦輸入已用C
6 2
1 2 3 4 5 6
4 3 3 4 5 6
凡在 第一行第一數目的在行變量數,第二個是行數。 如何才能獲得第一個n/2
值,其中n
是一行中的值的數量並跳到下一行?
我很驚訝,沒有人提到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數據來做這件事,因爲這些數字不佔用統一的空間。
以前,你知道一行中有多少個數字嗎?如果你的答案是肯定的,我建議你試試這個:
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]);
如果輸入長度不改變(例如,6號喜歡你的例子),你可以使用讀取所需的輸入:
scanf("%d %d %d", ...);
然後,處理輸入的其餘部分:
while ((ch = getchar()) != '\n' && ch != EOF);
如果輸入長度確實變化,你必須把它讀入緩衝區。然後,您可以迭代字符串以查找其中的空格數(So n = spaces + 1),然後使用strtok
n/2次再次迭代以獲得前n/2個數字。
可能值得注意的是,在你的第一個代碼片段中的'...'並不意味着'...',而是「你的變量在這裏」。 –
你能說說嗎?問題不清楚,你想要什麼類型的int或char或所有類型 – Omkant
im需要的類型是Int – asnewbie
提前不知道'n',你不能讀取n/2項* only *,不能超過當我告訴你這是我妻子的一半時,你可以確信我的侄女年齡。你需要知道'n',並且由於'n'是(linelength-1)/ 2來計算結束換行符,所以你需要讀取整行。您選擇保留的*相關*數據完全取決於您。 – WhozCraig