我是一名軟件工程專業的學生,爲了在下個學期更好,我正在聖誕節休息,我一直在編寫各種控制檯應用程序來練習。然而,我遇到了一個問題,我需要從用戶那裏得到整數輸入。我一直在使用fgets
從stdin
獲取字符串,然後使用sscanf
獲取整數(其工作正常),但是如果用戶輸入的數量多於我的緩衝區大小,則會在流中留下拖尾字符(包括換行符跳過我的下一次致電fgets
)。我環顧四周,發現大多數人似乎建議while(getchar() != '\n');
,但是這會導致我的問題,因爲如果沒有換行字符將被消耗一個不必要的掃描輸入發生。嵌入式輸入C
實施例:
int ch;
char* buffer = (char*)malloc(BUFSIZ*sizeof(char));
while((ch = getchar()) != '\n' && ch != EOF);
fgets(buffer,BUFSIZ*sizeof(char),stdin);
如果緩衝器不是太小和沒有尾隨字符保持在流中,然後有一個不必要的getchar()
造成輸入。
輸出:
A
A
You typed A
Intended Output:
A
You typed A
我希望我做這個很清楚,我感謝所有幫助。
請不要使用malloc來分配緩衝區,除非它非常大。遲早,你會忘記釋放它。 Windows和Linux的堆棧(在用戶空間中)是幾兆字節。 如果稍後需要將輸入數據存儲到某個有組織的數據結構中,則可能需要malloc並釋放該結構。但是在本地使用的小緩衝區上調用malloc是一個不錯的選擇。 –
他可能需要返回它,你不知道上下文。如果沒有被返回, –
可以使用alloca。當函數返回時,它會得到釋放,但實際上只是聲明一個數組可能是要走的路。 – kdubs