2016-11-05 60 views
-2

該錯誤發生在int getInt(void) while循環我想循環並要求用戶輸入一個數字,如果他們輸入10,它會通過,但如果他們要輸入10abc,它應該循環並再次詢問並持續詢問,直到輸入有效。它應該是萬無一失的,所以它只會通過一個數字來處理它,而那就是它。出於某種原因,while循環內的printf語句無限循環,我無法輸入新值。雖然語句錯誤傻瓜證明

{#include <stdio.h> 

void welcome(void); 
int getInt(void); 
double getDbl(void); 
void prnTitle(void); 
void prnFooter(double gTotal); 
void pause(void); 
double getDblLimited(double lowerLimit, double upperLimit); 

// 1註釋掉的主要里程碑提交一個 // 2 - 你的最後一個里程碑應該用下面的測試程序完美運行時。 //註釋掉main()中的箭頭後刪除接下來的兩個字符

int main(void) 
{ 
int iVal; 
double dVal; 
welcome(); 

// testing prnTitle() 
printf("listing header and footer with grand total:\n"); 
prnTitle(); 

printf(""); 

// Testing prnFooter() 
prnFooter(1234.5678); 
printf("listing header and footer without grand total:\n"); 
prnTitle(); 
prnFooter(-1); 


// Testing Pause() and clrKyb() 
pause(); 


// Testing getInt() 
printf("Enter an integer: "); 
iVal = getInt(); 
printf("You entered: %d\n", iVal); 


// Testing Get Int Limited 
printf("Enter an integer between 10 an 20: "); 
iVal = getIntLimited(10, 20); 
printf("Your entered %d\n", iVal); 


// Testing Get Double 
printf("Enter a floating point number: "); 
dVal = getDbl(); 
printf("You entered: %0.2lf\n", dVal); 


// Tesing Get Double Limited 
printf("Enter a floating point number between 10.00 an 20.00: "); 
dVal = getDblLimited(10.0, 20.0); 
printf("You entered: %0.2lf\n", dVal); 



printf("End of tester program for milestone one!\n"); 
return 0; 
} 

/*結束註釋掉主輸出*/

//實現你的功能一個里程碑到這裏: void welcome(void) printf(「--- === Grocery Inventory System === --- \ n」);

} 

void prnTitle(void) 
{ 
printf("Row |SKU| Name \t | Price |Taxed| Qty | Min | Total |Atn \n"); 
printf("----+---+--------------------+--------+-----+-----+-----+------------+|---\n"); 

} 
void prnFooter(double gTotal) 
{ 
printf("--------------------------------------------------------+-----------------\n"); 
//float gTotal = 1234.57; 
if (gTotal > 0) 
{ 
    printf("%12.21f", gTotal); 
} 
else 
{ 
    printf(""); 
} 

} 
void clrKyb(void) 
{ 
char b; 
while (b != '\n') 
{ 
    scanf("%c", &b); 
} 

} 
void pause(void) 
{ 
printf("Press <Enter> to continue..."); 

clrKyb(); 

} 
int getInt(void) 
{ 
//printf("Enter an interger:"); 
int d; 
char c; 
scanf("%d%c", &d, &c); 
while (c != '\n') 
    { 
     printf("Invalid integer, please try again"); 
     scanf("%d%c", &d, &c); 
    } 


    return d; 
} 


int getIntLimited(int lowerLimit, int upperLimit) 
{ 
int a; 
//printf("Enter an integer between %d and %d:", lowerLimit, upperLimit); 
scanf("%d", &a); 
while (a <= lowerLimit || a >= upperLimit) 
{ 
    // printf("Invalid value, %d < value < %d:", lowerLimit, upperLimit); 
    scanf("%d", &a); 
} 
return a; 
} 
double getDbl(void) 
{ 
double d; 
char c; 
// printf("Enter a floating point number:"); 
scanf("%lf,%c", &d, &c); 
while (c != '\n') 
{ 

    printf("Invalid number, please try again "); 
    scanf("%lf,%c", &d, &c); 
} 
return d; 
} 

double getDblLimited(double lowerLimit, double upperLimit) 
{ 
double a; 
printf("Enter a floating point number between %f and %f:", lowerLimit, upperLimit); 
scanf("%lf", &a); 
while (a <= lowerLimit || a >= upperLimit) 
{ 
    printf("Invalid value, %f < value < %f:", lowerLimit, upperLimit); 
    scanf("%lf", &a); 

} 
return a; 
return 0; 
} 
+0

這似乎是一樣http://stackoverflow.com/問題/ 40432191/c-無限循環錯誤 – Barmar

+0

這是一個不同的錯誤 –

+0

請正確格式化您的代碼。關於「提交時主註釋掉」的內容有什麼意義? – Barmar

回答

0

tsk tsk jason。閱讀大綱並查看流程圖。你需要添加「clrKyb();」進入while循環。

也明確性格是已經包含在stdio.h庫中的函數(這簡直是在我們的課本和筆記在線)

void clrkyb(void) 
{ 
    while(getchar() != '\n'); 
} ; 

int getInt(void) 
{  
    int d ; 
    char c ; 

    scanf("%d%c", &d, &c); 

    while(c != '\n') 
     { 
     clrKyb(); 
     printf("Invalid"...": "); 
     scanf("..." &..); 
     } 
    return d ; 
} ;