C 多次循环错误语句的函数

C 多次循环错误语句的函数,c,function,C,Function,我编写了一个函数“getInt”,如果用户没有输入有效的整数,例如2abc,则会显示一个错误,但该函数会为每个无效值输出一个错误。它仅在存在3个或更多无效值时才会执行此操作。例如,2ab可以,只显示一条错误消息,但2abc将显示3条错误消息。这是我的密码 #include <stdio.h> #include <stdlib.h> //tools void welcome(void); void printTitle(void); void printFooter(do

我编写了一个函数“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;

}

这里有很多问题。flushKeyboard函数的目的似乎是清除输入流,但在写入时,它进入循环并立即从函数返回。此外,getchar函数可以返回EOF,例如,如果用户从键盘发出信号,但可能更重要的是,如果getchar中有错误,则返回EOF。如果这发生在不检查EOF的循环中,则结果是一个无限循环

while (( read = getchar()) != '\n')
return;
上述行需要更改为:

while (( read = getchar()) != '\n' && read != EOF) {
    continue;
}
return;
此外,只有当输入流中有要清除的字符时,才应调用此清除输入流的循环;否则getchar将阻塞,等待输入。因此,在该行之后调用flushKeyboard:

printFooter(grandtotal);
需要删除。当我们在这里的时候,下面的getInt似乎除了让用户对输入感到困惑之外没有其他用途;这也应该被删除

在getInt函数中,需要删除对scanf的第二个调用。这里只需要提示更多输入,因为循环继续时将再次调用scanf。显示输入值的代码可以在返回语句之前移到循环之外

有了这些更改,并添加了一些新行来清理显示,代码似乎可以正常工作。我不相信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;
}
下面是对getInt函数的一个改进,它不仅更加简洁,而且提供了更好的输入提示。请注意,我将NL的初始化更改为“\0”,而不是“x”。没有那么重要,但是在任何用户输入中都不需要空字符

int getInt(void)
{
    int Value;
    char NL = '\0';

    printf("Enter an integer: ");    
    while (scanf("%d%c", &Value, &NL) != 2 || NL != '\n') {
        flushKeyboard();
        printf("Invalid integer, please try again:\n");
    }

    printf("You entered: %d\n", Value);

    return Value;
}

请提供一个单独显示该功能的。没有人需要筛选50行无关的代码来帮助你实现这一功能。@StoryTeller我认为这不仅仅是一个问题50@SagarV-我很抱歉,我提供了完整的代码,因为我之前的一个问题涉及到一些用户,他们说我应该提供完整的代码,即使他们与功能无关,这就是为什么我提供了我的全部代码。我确实将scanf语句保留为无效整数,以便用户可以继续尝试输入有效整数,但while语句似乎也循环要求用户输入整数。有没有办法让while循环在用户输入无效整数后停止运行?我实际上指的是函数getInt,其中初始无效整数后面的每个无效整数都将生成输出:输入整数:无效整数,请重试:但您的更新有助于getIntLimited函数正确循环,直到用户在参数中输入某些内容。这是因为当前输出将在错误消息旁边输入一个整数,这是不必要的。我会试试看是否可以修复它,但是谢谢你的帮助;当你运行所有的东西时,你应该考虑张贴。在那里,人们会更仔细地检查您的工作代码,并提出改进和风格的建议。
int getInt(void)
{
    int Value;
    char NL = '\0';

    printf("Enter an integer: ");    
    while (scanf("%d%c", &Value, &NL) != 2 || NL != '\n') {
        flushKeyboard();
        printf("Invalid integer, please try again:\n");
    }

    printf("You entered: %d\n", Value);

    return Value;
}