Продолжайте запускать программу, пока введенные данные верны - PullRequest
0 голосов
/ 13 февраля 2020

Итак, я только начал учиться программировать и работал над простой программой, которая сканирует и сохраняет введенное пользователем значение, пока оно является действительным значением с плавающей точкой. Если ввод неверен, то программа немедленно завершается с возвратом 1. Наконец, программа выведет сохраненное значение, если все входы верны. Я думал о такой структуре, как

while (scanf("%f",input)==1){
    //code that store the value of input;
    value=input
}
else{
    printf("invalid");
    return 1
}
printf("%f",value);

Но дело в том, что не существует структуры «Пока», и я действительно изо всех сил пытаюсь обойти это. Есть ли какие-либо другие условия, которые я могу сделать на входе, чтобы получить желаемый результат?

Кстати, я думаю, что простое удаление else действительно не работает - потому что для вывода значения я должен использовать Ctrl d вручную выйти из режима l oop. Тогда, потому что я вышел, пока l oop, я буду печатать неверно, несмотря ни на что. Существует ли структура, которая будет печатать только значение? Спасибо.

Ответы [ 3 ]

0 голосов
/ 13 февраля 2020

Я полагаю, ваш код находится в одной функции, и вы хотите вернуться оттуда, если ввод неправильный, поэтому в этом случае это будет работать

while(1) {
    //code that store the value of input;
    if (scanf("%f",input)==1){
      value=input
    }
    else{
      return 1;
    }
}


0 голосов
/ 13 февраля 2020

Предикат while должен быть ложным, так как go включен, поэтому гипотетический while-else совпадает с while. Нужно выбрать между (как минимум) тремя исходами из sscanf:

  • завершенной обработки с плавающей запятой;
  • обработки ошибок (это может быть ошибка основного потока или синтаксис ошибка);
  • конец файла, (из stdin.)

Из документации sscanf можно использовать эту настройку,

#include <stdlib.h>
#include <stdio.h>

int main(void) {
    float input, value;
    int nread;
    while((nread = scanf(" %f", &input)) == 1) {
        ////code that store the value of input;
        value=input;
    }
    if(ferror(stdin)) {
        // nread != 1 && ferror: error reading input.
        perror("stdin"); // POSIX.1-2017 guarantees this will be set, not C99.
        return EXIT_FAILURE;
    } else if(nread != EOF) {
        // nread != 1 && nread != EOF && !ferror: matching error.
        fprintf(stderr, "Syntax error.\n");
        return EXIT_FAILURE;
    }
    // nread == EOF && !ferror: normal, input ends before the first conversion has
    // completed, and without a matching failure.
    return EXIT_SUCCESS;
}

Возвращаемое значение из sscanf содержит больше информации, чем просто двоичное решение, поэтому в общем случае его нужно сохранить.

0 голосов
/ 13 февраля 2020

a while l oop будет продолжать работать вечно до тех пор, пока не будет достигнуто условие выхода, это означает, что else не требуется, потому что приведенный ниже код не будет выполняться.

Простым решением этой проблемы будет удаление else, потому что оно не нужно:)

...