假設代碼不塊和下一行運行立即(如你似乎在這個問題早在a comment表示),你攪拌時有一個共同的問題,非線爲基礎,線基於輸入。
會發生什麼事是你必須留在緩衝區換行,並與fgets看到的是,讀取它,並返回,而不是做你真正想要的:忽略它,然後讀線。
的解決方案是簡單地做自己的忽略的部分,然後調用與fgets:
#include <stdio.h>
#include <string.h>
FILE* ignoreline(FILE* stream) {
for (int c; (c = fgetc(stream)) != EOF;) {
if (c == '\n') break;
}
return stream;
}
void example_use() {
char buf[1000];
ignoreline(stdin);
fgets(buf, sizeof buf, stdin);
// or, since it returns the stream, can be more compact:
fgets(buf, sizeof buf, ignoreline(stdin));
}
int main() { // error handling omitted
int n;
printf("Enter a number: ");
scanf("%d", &n);
char buf[1000];
printf("Enter a line: ");
ignoreline(stdin); // comment this line and compare the difference
fgets(buf, sizeof buf, stdin);
*strchr(buf, '\n') = '\0';
printf("You entered '%s'.\n", buf);
return 0;
}
注意,這也是常見的,並鼓勵他們「配對」的ignoreline與scanf函數(或其他非線基於輸入)將其轉化爲基於行的輸入。在這種情況下,您可能需要對其進行修改,以便您可以分辨輸入「42 abc」和「42」(在「輸入數字」情況下)之間的區別。有些人只是在任何地方都使用fgets,然後用sscanf解析該行,並且這可以工作,但沒有必要。
這個問題是非常明確的,我認爲它可以保持原樣。 – extraneon 2010-02-22 15:27:01
我確實同意它更清楚。 – 2010-02-22 15:28:26
你*可能*編輯這個更清晰的「我如何正確地調用fgets與stdin來做X」,**包含一個測試用例**(或至少是示例代碼)等。 – 2010-02-22 15:33:03