2011-08-07 74 views
3

我正在爲C編程課程的最終項目工作。該項目是創建一個數據庫來存儲藥物信息。我已經完成了所有的要素,現在要精細調整一切。使用scanf的問題,允許用戶跳過問題

在用戶可以更改藥品信息的功能中,項目中有一個要求。在要求中,用戶應該能夠通過按回車鍵跳過一個字段。例如,用戶可以改變藥物的生產者和數量。如果用戶不想更改生產者,他們會按Enter鍵並轉到數量上。

我環顧了網絡,並能夠讓用戶跳過爲生產者輸入字符串。但是,我無法使用整數工作。

這是我使用,使得用戶可以跳過輸入字符串:

scanf("%30[^\n]", fentry[found].producer); 

爲了清楚起見,fentry.producer是具有30個字符的字符串,發現是整型變量。

我試過做類似的整數輸入(編輯:通過整數輸入,我的意思是輸入數量,而不是'發現'變量)。它可以讓你跳過輸入內容,但是如果你輸入了一些內容,它會存儲一個隨機值。

任何人都知道如何去做這件事?

回答

3

而不是使用scanf(),從用戶獲得交互輸入的更好方法是使用fgets()。這個函數獲得一個完整的輸入行,直到用戶按Enter的地方,並返回它,以便解析它。如果您願意,您可以使用sscanf()來讀取信息。 sscanf()的工作原理與scanf()幾乎完全相同,只是它從字符串中讀取數據,而不是從標準輸入讀取數據。

+0

感謝您的幫助,我解決了原來的問題。 我的編程課程相對於我偶然發現的非常基礎,所以我從來沒有使用過fgets()或sscanf()。是否有辦法接受空間和其他一切? – confusedstudent

+0

我不確定你的意思是「允許」。 'fgets()'函數返回用戶輸入的內容,空格和所有內容,直到用戶按Enter鍵的換行符。你可以直接使用這個字符串(也就是說,不需要使用'sscanf()'從字符串中獲取一個字符串),或者如果你想獲得多個數據項,你可以在字符串內查找(例如,一行中有兩個數字)。 –

+0

聽起來好像你正在使用'sscanf()'從字符串中獲取一個字符串。在'sscanf()'中使用'%s'格式說明符時,它會在遇到第一個空格時停止掃描。這就是爲什麼你只能得到一個字。在這種情況下的答案是根本不使用'sccanf()',因爲'fgets()'本身就給你一個完整的字符串。你可能需要做的就是除去換行符('\ n'')。 –

0

這是怎麼回事?

char s[50]; 
fgets(s, 50, stdin); 

if(s[0] != '\n') { 
    fentry[found].producer = atoi(s); 
} 

雖然你必須刪除所有的空格。

0

您是否在scanf之前將整數初始化爲0?

0
scanf("%29s", fentry[found].producer); while('\n'!=getchar()); 

這是可以的,完全符合ANSI C標準,便攜。 輸入緩衝區被清除,chararray-length被支持,chararray包含一個(終止)'\ 0'(不需要初始化)並且你的數組永遠不會包含用戶輸入的'\ n'。

0

我懷疑鍵盤緩衝區導致您的代碼中的問題。第一次調用代碼時,它會讀取最多30個字符 - 只要它們不是NEWLINE字符。他們在閱讀NEWLINE時會終止。 NEWLINE將保留在緩衝區中。

但是......如果您再次以相同的方式調用scanf,則前一次調用的NEWLINE仍將位於鍵盤緩衝區中。在從鍵盤請求更多輸入之前,這將被讀取。 NEWLINE將立即失敗scanf模式,char數組不會被更新,並且您將被留給指向未初始化內存區域的char指針。