一個與scanf
和所有的格式化輸入功能的一個問題是端子傾向於在line mode or cooked mode操作和API被設計用於原始模式。換句話說,scanf
實現通常不會返回,直到遇到換行。輸入被緩衝,未來呼叫scanf
將消耗緩衝線路。請看下面的程序:
#include <stdio.h>
int main() {
int a_number;
printf("Enter a number: ");
fflush(stdout);
while (scanf("%d", &a_number) != EOF) {
printf("you entered %d\n", a_number);
printf("Enter another number: ");
fflush(stdout);
}
return 0;
}
您可以按回報之前輸入多個號碼。這是一個運行這個程序的例子。
bash$ gcc foo.c
bash$ ./a.out
Enter a number: 1 2 3 4 5 6 7 8 9 10<Return>
you entered 1
Enter another number: you entered 2
Enter another number: you entered 3
Enter another number: you entered 4
Enter another number: you entered 5
Enter another number: you entered 6
Enter another number: you entered 7
Enter another number: you entered 8
Enter another number: you entered 9
Enter another number: you entered 10
Enter another number: <Ctrl+D>bash$
bash$
到scanf
每次調用從輸入流中讀取一個單一的數字,但在第一次調用纔回來之後,我按下回報。剩餘的調用立即返回,不會阻塞更多的輸入,因爲輸入流被緩衝,並且可以從流中讀取另一個整數。
替代方案是使用fgets
並一次處理整行數據或使用the terminal interface來禁用"canonical input processing"。大多數人使用fgets
,因爲POSIX的終端接口部分未在Windows下實現。
你的問題是什麼? – Mat 2011-03-13 13:09:33
'fprintf(stdout,「%d」,&comanda);''''不應該在那裏。就像旁註一樣。 – dialer 2011-03-13 13:10:42
請更具體。當你說「什麼都沒有發生」時代碼停止在哪裏?它在哪裏阻塞? – Mat 2011-03-13 13:19:03