繁体   English   中英

我该如何解决用C语言编写的if语句,以使其按预期工作?

[英]How would I fix this if statement in C to get it working as intended?

在“联系人管理系统”的这段代码中,我很难获得一行的预期输出。 基本上,在这一部分中,当您添加新联系人时,它会要求您“请输入公寓编号”,如下所示:

 if (yes() == 1)
 {
     printf("Please enter the contact's apartment number: ");
     address->apartmentNumber = getInt();
     if (address->apartmentNumber > 0)
     {
     }
     else
     {
        printf("*** INVALID INTEGER *** <Please enter an integer>: ");
        address->apartmentNumber = getInt();
    }
  }
  else
  {
      address->apartmentNumber = 0;
  }

现在,根据我的任务,您应该输入单词“ bison”(而不是数字,得到它?),该单词将显示输出:

* INVALID INTEGER *请输入一个整数:

对于上下文,这部分工作正常。 但是,您将被指示输入整数“ -1200”,然后将弹出提示

*无效的公寓号*请输入一个正数:

这是我遇到的问题,因为简单地说,无论是在if语句中还是在if语句之外,我都不知道将其放在哪里。 我不确定,并希望对此有所帮助。

我试图自己解决问题,但这只是使我获得了无效整数输出的两倍,而不是这个正确的无效公寓号码声明。 这是我的(失败)尝试:

    if (yes() == 1)
    {
        printf("Please enter the contact's apartment number: ");
        address->apartmentNumber = getInt();

        if (address->apartmentNumber > 0)
        {
        }
        else
        {
            printf("*** INVALID INTEGER *** <Please enter an integer>: ");
            address->apartmentNumber = getInt();
        }
        if (address->apartmentNumber < 0)
        {
        }
        else
        {
            printf("*** INVALID APARTMENT NUMBER *** <Please enter a positive number>: ");
            address->apartmentNumber = getInt();       
        }
        else
        {
            address->apartmentNumber = 0;
        }

编辑:对于那些要求getInt()和yes()代码的人,这里:

getInt()

int getInt(void)
{
    int num;
    char nl;

    scanf("%d%c", &num, &nl);
    while (nl != '\n') {
        clearKeyboard();

        printf("*** INVALID INTEGER *** <Please enter an integer>: ");
        scanf("%d%c", &num, &nl);
    }
    return num;
}

是的():

int yes(void)
{
    int yesno, flag;
    char c, nl;
    scanf("%c%c", &c, &nl);

    do {
        if (nl != '\n') {
            clearKeyboard();

            printf("*** INVALID ENTRY *** <Only (Y)es or (N)o are acceptable>: ");
            flag = 1;
            scanf("%c%c", &c, &nl);
        }
        else if (c != 'Y' && c != 'y' && c != 'N' && c != 'n') {
            printf("*** INVALID ENTRY *** <Only (Y)es or (N)o are acceptable>: ");
            flag = 1;
            scanf("%c%c", &c, &nl);
        }
        else if (nl == '\n' && (c == 'Y' || c == 'y' || c == 'N' || c == 'n')) 
        {
            flag = 0;
        }
    } while (flag == 1);

    if (c == 'Y' || c == 'y') {
        yesno = 1;
    }
    else {
        yesno = 0;
    }
    return yesno;
}

getInt将处理非整数(文本和单词)输入,并提示用户键入整数,直到输入为止。

因此,您的代码需要更像这样:

if (yes() == 1)
{
     int validNumber = 0;
     while (validNumber == 0)
     {
         printf("Please enter the contact's apartment number: ");
         address->apartmentNumber = getInt();
         if (address->apartmentNumber > 0)
         {
             validNumber = 1;
         }
         else
         {
             printf("* INVALID APARTMENT NUMBER * Please enter a positive number:\n");
         }
     }
}

您的getint()函数非常脆弱。 用户仅输入一次非整数值是什么意思? 接受特定类型的输入时,通常最好连续循环直到收到有效输入(或用户取消输入)为止,并始终防止输入的输入不是您期望的(例如当猫踩键盘时) ...)

如果正确使用,可以使用scanf 这意味着有责任每次都检查scanf返回 您必须处理三个条件

  1. (return == EOF)用户通过按Ctrl + d生成手动EOF (或在Windows Ctrl + z上 ,但请参见CTRL + Z在Windows 10(早期版本)中不会生成 (return == EOF)来取消输入;
  2. (return < expected No. of conversions)发生匹配输入失败。 对于匹配失败,您必须考虑输入缓冲区中剩余的每个字符。 (向前扫描输入缓冲区,读取并丢弃字符,直到找到'\\n'EOF ); 最后
  3. (return == expected No. of conversions)表示读取成功-然后由您检查输入是否满足任何其他条件(例如,正整数,正浮点,在所需范围内等)。 。

将其与getint()函数一起使用并传递一个字符串以显示为用户提示(如果不是NULL ),则可以执行以下操作:

int getint (int *value, const char *prompt)
{
    /* loop continually until good input or canceled */
    for (;;) {
        int rtn;        /* variable for return from scanf */
        if (prompt)                     /* if not NULL    */
            fputs (prompt, stdout);     /* display prompt */
        rtn = scanf ("%d", value);      /* attempt read   */

        if (rtn == EOF) {   /* check for manual EOF */
            fputs ("<user canceled input>\n", stderr);
            return 0;
        }
        empty_stdin();  /* all other cases - empty input buffer */
        if (rtn == 1)   /* good input, break */
            break;
        /* otherwise matching failure */
        fputs ("  error: invalid integer input.\n", stderr);
    }
    return *value;  /* value also available through pointer */
}

注意:从函数返回的值是对函数是否成功(返回1 )或用户是否通过EOF取消(返回0 )的验证,整数值可通过指针value提供给调用方)

辅助函数empty_stdin()简单来说就是:

void empty_stdin (void)
{
    int c = getchar();
    while (c != '\n' && c != EOF)
        c = getchar();
}

有多种方法可以将getint()放在一起以根据需要进行调整,只要您能正确处理上述所有三种情况,就可以随意使用任意方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM