2016-11-05 91 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 ; 
} ;