我如何修复C中的if语句以使其按预期工作?

我如何修复C中的if语句以使其按预期工作?,c,if-statement,C,If Statement,在联系人管理系统的这段代码中,我很难获得一条线路的预期输出。基本上,在这一部分中,当您添加一个新联系人时,它会要求您进入一个公寓,如下所示: if (yes() == 1) { printf("Please enter the contact's apartment number: "); address->apartmentNumber = getInt(); if (address->apartmentNumber > 0) {

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

 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;
  }
现在,根据我的作业,你应该输入单词而不是数字,明白吗?带出输出的野牛:

*无效整数*请输入一个整数:

在上下文中,这一部分工作得非常好。但是,随后会指示您输入整数-1200,然后会出现提示

*公寓号码无效*请输入正数:

我对这一部分有异议,因为简单地说,我不知道该把它放在哪里,无论是在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代码的人,请点击此处:

格廷

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函数非常脆弱。用户只输入一次非整数值是什么意思?在接受特定类型的输入时,通常最好持续循环,直到您收到有效输入或用户取消输入,并且始终防止输入与您期望的输入不同,因为当cat在键盘上移动时

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

return==用户通过按Ctrl+d或windows Ctrl+z生成手动EOF来取消输入的EOF,但请参见; return<发生匹配或输入失败时的预期转换次数。对于匹配失败,必须说明输入缓冲区中剩余的每个字符。在输入缓冲区中向前扫描读取和丢弃字符,直到找到“\n”或EOF;最后 return==表示成功读取的预期转换次数-然后由您检查输入是否满足任何附加条件,例如正整数、正浮点、在所需范围内等。。。 将其与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 */
}

有很多方法可以将getint组合在一起,根据您的需要进行定制,只要您正确处理上述三种情况,您就可以按照自己喜欢的方式进行操作。

?你需要把这个收紧一点。yes和getInt做什么?这些是函数。这是一个绝对庞大的任务,在多个c和头文件上有大量代码。你可以假装它们不在那里,即兴发挥,就好像它们不被需要一样,如果这有帮助的话,任何合适的修复程序都必须传播到getInt中。提示:数字0。你能分享getInt的代码吗?最好是yes?@Joshua Huh?我被这句话弄糊涂了。我想举一个例子来说明你的意思,这可能行得通,但它告诉我有效的输入是未定义的。我应该在哪里定义它?bool false和true表示它们未定义,这会在构建解决方案时导致错误。它的字面定义为bool validInput=false;您还需要什么?我的意思是,在VisualStudio中,它以红色下划线bool、false和true。每当我将鼠标悬停在这三个选项中的任何一个上时,都会显示它们未定义,并给出无法生成解决方案的错误,然后继续调试。这就是我的意思…我倾向于相信你还没有通过hello world学习C的阶段。你熟悉基本的编程概念,如循环、布尔、条件逻辑等吗。。。我已经将validNumber更改为整数,以防您的C编译器还不能识别C中的bool语法。如果这不起作用,你就得自己学习程序结构和变量声明的基础知识。@Aaron-是的,去做。
void empty_stdin (void)
{
    int c = getchar();
    while (c != '\n' && c != EOF)
        c = getchar();
}