Как бы я это исправить, если заявление в C, чтобы заставить его работать как задумано? - PullRequest
0 голосов
/ 31 марта 2019

В этом куске кода для «системы управления контактами» у меня возникают трудности с получением нужного результата для линии. Как правило, во время этой одной части, когда вы добавляете новый контакт, он просит вас «пожалуйста, введите номер квартиры», как показано ниже:

 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;
  }

Теперь, согласно моему заданию, вы должны ввести слово (вместо числа, получить его?) "Зубр", которое выводит:

* Недействительный INTEGER * Пожалуйста, введите целое число:

Для контекста эта часть работает абсолютно нормально. Тем не менее, вы должны указать целое число "-1200", которое должно вызвать приглашение

* Неверный номер квартиры * Пожалуйста, введите положительное число:

Именно в этой части у меня возникла проблема, потому что, проще говоря, я не знаю, где ее поставить, в выражении if или за ее пределами. Я не уверен, и любезно хотел бы помочь с этим.

Я попытался исправить проблему сам, но это просто дает мне двойную ошибку Invalid integer вместо этого правильного оператора Invalid number number. Вот моя (неудачная) попытка:

    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;
}

Ответы [ 2 ]

1 голос
/ 31 марта 2019

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");
         }
     }
}
0 голосов
/ 31 марта 2019

Ваша getint() функция ужасно хрупкая. Что сказать, пользователь вводит нецелое значение только один раз? При получении ввода определенного типа, как правило, лучше постоянно выполнять цикл, пока вы не получите действительный ввод (или пользователь не отменит ввод), и всегда защищать от ввода, который не соответствует ожидаемому (например, когда кошка наступает на клавиатуру). ...)

scanf можно использовать, если используется правильно. Это означает, что вы несете ответственность за проверку возврата из scanf каждый раз . Вы должны справиться с тремя условиями

  1. (return == EOF) пользователь отменил ввод, сгенерировав руководство EOF, нажав Ctrl + d (или в windows Ctrl + z , но см. CTRL + Z не генерирует EOF в Windows 10 (ранние версии) );
  2. (return < expected No. of conversions) a соответствие или вход произошел сбой. Для соответствия вы должны учитывать каждый символ, оставшийся в вашем входном буфере. (сканирование вперед во входном буфере с чтением и отбрасыванием символов до тех пор, пока не будет найдено '\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(), чтобы адаптировать его к вашим потребностям, если вы правильно справитесь со всеми тремя вышеупомянутыми случаями, вы можете делать это любым способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...