我写了一个函数'getInt'来显示一个错误,如果用户没有输入一个有效的整数(例如2abc),但是该函数会为每个无效值输出一个错误。只有当有3个时才会这样做或更多无效值。例如2ab会没问题,只显示一条错误信息,但2abc会出现3条错误信息。这是我的代码
#include <stdio.h>
#include <stdlib.h>
//tools
void welcome(void);
void printTitle(void);
void printFooter(double gTotal);
void flushKeyboard(void);
void pause(void);
int getInt(void);
double getDouble(void);
int getIntLimited(int lowerLimit, int upperLimit);
double getDoubleLimited(double lowerLimit, double upperLimit);
//app interface
int yes(void);
void GroceryInventorySystem(void);
int menu(void);
int main(void){
int iVal;
double dVal;
welcome();
printTitle();
double grandtotal = 1234.57;
printFooter(grandtotal);
flushKeyboard();
pause();
getInt();
int lowerLimit = 10;
int upperLimit = 20;
getIntLimited(lowerLimit, upperLimit);
return 0;
}
//code your functions here:
void welcome(void)
{
printf("---=== Grocery Inventory System ===---");
printf("\n");
return;
}
void printTitle(void)
{
printf("Row |SKU| Name | Price |Taxed| Qty | Min | Total |Atn\n");
printf("----+---+---------------+-------+-----+-----+-----+-------------|---");
printf("\n");
return;
}
void printFooter(double grandTotal)
{
printf("--------------------------------------------------+-----------------");
printf("\n");
if (grandTotal > 0) {
printf(" Grand Total: | %12.2lf", grandTotal);
}
return;
}
void flushKeyboard(void)
{
int read;
while (( read = getchar()) != '\n')
return;
}
void pause(void)
{
printf("Press <ENTER> to continue...");
flushKeyboard();
return;
}
int getInt(void)
{
int Value;
char NL = 'x';
while (NL != '\n') {
printf("Enter an integer: ");
scanf("%d%c", &Value, &NL);
if (NL != '\n') {
flushKeyboard();
printf("Invalid integer, please try again:");
scanf("%d%c", &Value, &NL);
}
else {
printf("You entered: %d\n", Value);
}
}
return Value;
}
int getIntLimited(int lowerLimit, int upperLimit)
{
int limit;
do {
limit = getInt();
if(lowerLimit > limit || limit > upperLimit) {
printf("Invalid value, %d < %d < %d: ", lowerLimit, limit, upperLimit);
}
}
while(lowerLimit < limit && limit < upperLimit);
return limit;
}
答案 0 :(得分:2)
这里有很多问题。 flushKeyboard()
函数的目的似乎是清除输入流,但是在写入时它会立即从函数进入循环和return
。此外,getchar()
函数可以返回EOF
,例如,如果用户从键盘发出信号,但更重要的是,如果{{1}中存在错误,则会返回EOF
}。如果这发生在不检查getchar()
的循环中,则结果是无限循环。
EOF
以上几行需要更改为:
while (( read = getchar()) != '\n')
return;
此外,只有在输入流中有字符要清除时,才应调用清除输入流的循环;否则while (( read = getchar()) != '\n' && read != EOF) {
continue;
}
return;
将阻止,等待输入。所以,在行之后调用getchar()
:
flushKeyboard()
需要删除。虽然我们在这里,但以下printFooter(grandtotal);
似乎没有其他目的,只是混淆了用户的输入;这也应该被删除。
在getInt()
函数中,需要删除对getInt()
的第二次调用。此处仅需要提供更多输入的提示,因为当循环继续时将再次调用scanf()
。显示输入值的代码可以在scanf()
语句之前移出循环。
通过这些更改以及一些用于清理显示的新行,代码似乎可以正常工作。我不相信return
中的条件完全符合预期。如上所述,如果用户输入getIntLimited()
或lowerLimit
,则接受输入并退出该功能。如果用户输入的数字超出此范围,该函数将打印错误消息并退出。如果用户在范围内输入数字,则该函数继续询问新的整数。
以下是原始代码的修改版本:
upperLimit
以下是#include <stdio.h>
#include <stdlib.h>
//tools
void welcome(void);
void printTitle(void);
void printFooter(double gTotal);
void flushKeyboard(void);
void pause(void);
int getInt(void);
double getDouble(void);
int getIntLimited(int lowerLimit, int upperLimit);
double getDoubleLimited(double lowerLimit, double upperLimit);
//app interface
int yes(void);
void GroceryInventorySystem(void);
int menu(void);
int main(void){
int iVal;
double dVal;
welcome();
printTitle();
double grandtotal = 1234.57;
printFooter(grandtotal);
pause();
int lowerLimit = 10;
int upperLimit = 20;
getIntLimited(lowerLimit, upperLimit);
return 0;
}
//code your functions here:
void welcome(void)
{
printf("---=== Grocery Inventory System ===---");
printf("\n");
return;
}
void printTitle(void)
{
printf("Row |SKU| Name | Price |Taxed| Qty | Min | Total |Atn\n");
printf("----+---+---------------+-------+-----+-----+-----+-------------|---");
printf("\n");
return;
}
void printFooter(double grandTotal)
{
printf("--------------------------------------------------+-----------------");
printf("\n");
if (grandTotal > 0) {
printf(" Grand Total: | %12.2lf\n", grandTotal);
}
return;
}
void flushKeyboard(void)
{
int read;
while (( read = getchar()) != '\n' && read != EOF) {
continue;
}
return;
}
void pause(void)
{
printf("Press <ENTER> to continue...");
flushKeyboard();
return;
}
int getInt(void)
{
int Value;
char NL = 'x';
while (NL != '\n') {
printf("Enter an integer: ");
scanf("%d%c", &Value, &NL);
if (NL != '\n') {
flushKeyboard();
printf("Invalid integer, please try again:\n");
}
}
printf("You entered: %d\n", Value);
return Value;
}
int getIntLimited(int lowerLimit, int upperLimit)
{
int limit;
do {
limit = getInt();
if(lowerLimit > limit || limit > upperLimit) {
printf("Invalid value, %d < %d < %d:\n", lowerLimit, limit, upperLimit);
}
} while(lowerLimit < limit && limit < upperLimit);
return limit;
}
中错误逻辑的修改,提示用户再次输入输入,直到输入在范围内。您可能需要调整错误消息:
getIntLimited()
这是int getIntLimited(int lowerLimit, int upperLimit)
{
int limit;
do {
limit = getInt();
if(limit < lowerLimit || upperLimit < limit) {
printf("Invalid value, %d < %d < %d:\n", lowerLimit, limit, upperLimit);
}
} while(limit < lowerLimit || upperLimit < limit);
return limit;
}
函数的改进,它更简洁,并提供更好的输入提示。请注意,我将getInt()
的初始化更改为NL
,而不是'\0'
。并不重要,但在任何用户输入中都不会出现空字符。
'x'