2013-09-29 87 views
3

我想閱讀療法用戶的鍵盤輸入兩個字符串,這是我試過的代碼:與fgets不會等待鍵盤輸入

char nomFichier[50], emp[100], empEtNomFichier[150]; 
printf("\nDonner le nom du fichier : "); 
fgets(nomFichier, sizeof nomFichier, stdin); 
printf("\nDonner l'emplacement du fichier : "); 
fgets(emp, sizeof emp, stdin) 
sprintf(empEtNomFichier, "%s/%s", emp, nomFichier); 

問題是,當我運行此代碼,程序沒有按「T等待鍵盤輸入的第一fgets(),廣告,這是程序的外觀如何:

Donner le nom du fichier : 
Donner l'emplacement du fichier : /home/ee/Desktop 
/home/ee/Desktop 
+0

你可以發佈最短的可編譯示例,你可以證明這個問題? –

+0

@PaulGriffiths,請參閱我對我的文章所做的修改 –

+0

「compilable」我的意思是將它包含在main()函數中,#include正確的頭文件等等,只是被複制和編譯,並且在編譯和運行時會產生問題。您當前的代碼中可能會有其他內容導致它,創建一個可編譯的示例將有助於消除這種可能性。例如,如果我把你的代碼放到'main()'函數中,我就不能重現你的問題。 –

回答

5

的問題是真的與fgets()讀取終止換行符到字符串。除非緩衝區填滿,否則遇到沒有換行符的EOF,返回字符串中的最後一個字符將是'\ n'。

通過擺脫指出:

n = strlen(nomFichier); 
if (n>0 && nomFichier[n-1]=='\n') { nomFichier[n-1] = 0; } 

...和做同樣的EMP字符串,如果塊中。還有一些方法可以用'\ n'作爲分隔符來使用strtok,或者使用帶有'%xx [^ \ n]%* c「格式的sscanf,另外我相信其他人有不同的最喜歡的解決方案。 (「xx」是該scanf格式中的最大字符串長度,以十進制表示)。

順便說一句,另一個問題不能由fflush移植地解決,因爲fflush不一定會做任何事情。例如,GNU C實現將fflush(stdin)視爲無操作。

該問題很可能是由於先前的scanf()讀取了一個值,但未讀取換行符。在面向標記的輸入(scanf/fscanf)和麪向行的輸入(fgets)之間切換的程序必須準備好處理剩餘行。

最快的解決方法是:

scanf("%*[^\n]%*c"); /* discard up to and including the next '\n' character */ 

...或更直接:

int c; 
while ((c = getchar()) != EOF && c != '\n') { } 

無論哪種方式,我把在靜態功能,讓優化決定是否內嵌或不內嵌。

每次從scanf()切換到fgets()輸入時,都需要這樣做。

+0

感謝任何人的反對票。它不僅提醒我回到這個問題上,而且還得到了我的回報。 –

0

嘗試:

char nomFichier[50], emp[100], empEtNomFichier[150]; 
printf("\nDonner le nom du fichier : "); 
fflush(stdout); 
fgets(nomFichier, sizeof nomFichier, stdin); 
printf("\nDonner l'emplacement du fichier : "); 
fflush(stdout); 
fgets(emp, sizeof emp, stdin) 
sprintf(empEtNomFichier, "%s/%s", emp, nomFichier); 

stdout是行緩衝的,所以它不會輸出沒有\ n字符 - 嘗試fflush();

或者試試:

char buf[256]={0x0}; 
setvbuf(stdout, buf, _IONBF, 256); 
+0

起初我也是這麼想的,但他的問題是,太多的東西看起來是輸出,而不是太少。無論如何,他說他嘗試了這一點,但沒有奏效。 –

+0

好吧 - 我錯過了他試過fflush()的地方。但這是一個解決方案。另一個是使用setvbuf()將stdout更改爲無緩衝 - 這不是一個好主意。我會添加它。 –

+0

是的,我刪除了答案和評論。我不確定他是否在代碼中做了其他事情,而沒有顯示出與緩衝有關的問題。 –