我知道這個問題得到問百餘次,我已經走遍了所有的可能性,但我想我不夠嫺熟知道在哪裏這個問題所在。我正在編寫一個程序,我需要用數據填充結構(整數和字符串)。第一次嘗試時,它跳過了第一個,但是我沒有驚慌,因爲我記得我需要使用fflush(stdin)
來克服這個問題。網站我搜索投票反對使用fflush(stdin)
,因爲它有未定義的行爲。他們說使用getchar()
會吃額外的換行符,從而解決問題。因此,我的代碼:scanf函數都不會被跳過,即使有安全裝置(getchar函數())
int manNode(){
Item *p;
int helper;
p = (Item*)malloc(sizeof(Item));
printf("Welk type? (Taak:1, Examen:2, Voordracht:3)\n");
scanf("%u",&helper); //selecting an itemtype
if (helper < 1 || helper > 3)
{
printf("wrong value, please try again");
return 0;
}
getchar(); //I've just put getchars everywhere for safety.
p->entrytype = helper-1;
helper = 0;
printf("Vul een naam in:\n");
scanf("%s", p->name); //this one fills in fine
getchar();
printf("Vul een vaknaam in: \n");
scanf("%s", p->course); //this one gets skipped if I type more than one letter in the last scanf()
getchar();
printf("Vul een starttijd in:\n"); //From here on out everything gets skipped
p->start = getTijd();
checkTijd(p->start);
printf("Vul een eindtijd in: \n");
p->end = getTijd();
checkTijd(p->end);
我知道這有點混亂,但專注於scanfs和getchars。 getTijd()
也有一對scanfs掃描整數,他們也被跳過。我不知道該從哪裏出發。 (代碼不完整,剩下的只是無關緊要的)
你可以顯示結構'項目? – Ishmeet
'scanf'大約是最壞的分析工具,在C語言中,因爲它試圖做兩個任務(讀取輸入,並將其分解成塊),當作品是不完全如預期離開輸入流中的難 - 確定狀態。 'fgets/sscanf'使得分工更加健壯。 – msw
您必須檢查每次使用scanf()時都會成功。當它出錯時,它仍然是錯誤的。你應該錯誤檢查'getchar()'函數。您還應該通過打印剛剛讀取的值來進行調試,以確保獲得您認爲的所有結果。 –