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

Из быстрого google:

Существует также один спецификатор, который не соответствует аргументу. Это «% n», который выводит разрыв строки. В некоторых случаях также можно использовать «\n», но поскольку «% n» всегда выводит правильный разделитель строк для конкретной платформы, он переносится по платформам, тогда как «\n» - нет.

blockquote>

Пожалуйста, обратитесь к https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

Исходный источник

0
задан user11281949 31 March 2019 в 07:15
поделиться

2 ответа

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
ответ дан selbie 31 March 2019 в 07:15
поделиться

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

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

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

Вспомогательная функция empty_stdin() просто:

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

Есть много способов поставить getint() вместе, чтобы адаптировать его к вашим потребностям, если вы правильно обрабатываете все три случая, описанные выше, вы можете делать это любым способом.

0
ответ дан David C. Rankin 31 March 2019 в 07:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: