C: использование «scanf» для чтения числа с плавающей точкой в ​​строке других символов - PullRequest
0 голосов
/ 25 января 2019

Я новичок в C и пишу программу, которая действует как калькулятор, где каждая строка входного кода начинается с оператора, а затем содержит потенциальные пробелы, число, больше потенциальных пробелов и разрыв строки.Я получил указание использовать getchar для чтения всего, кроме числа с плавающей запятой, и scanf для чтения числа с плавающей запятой.

Я не уверен, как использовать scanf для чтения числа с плавающей запятой, смешанного в строкедругие персонажи.Приведенный ниже код показывает большую часть цикла while, который также включает чтение остальных символов, но наиболее важной частью являются последние 3 строки.

while (1) { 
    int ic = getchar(); 
    if (ic < 0) 
        break;   //EOF 
    char temp = (char) ic;
    if (temp == '+' || temp == '-' || temp == '*' || temp == '/' || 
        temp == '=' || temp == 'C' || temp == 'Q'){ 
        op = (char) ic;
    }
    if (temp >= '0' && temp <= '9'){
        char valu = scanf("%c", &temp);
        val = (double) valu; 
...  

Я ожидал, что будет прочитано значение, котороев строке ввода, но когда я его печатаю, он всегда отображается как "1.0000".

1 Ответ

0 голосов
/ 25 января 2019

Шаг за шагом

Рекомендую не экономить на проверке ошибок. Предположим, что пользовательский ввод может быть неожиданным.

, где каждая строка входного кода начинается с оператора

Очень похоже на код OP

int ic = getchar(); 
if (ic == '+' || ic == '-' || ic == '*' || ic == '/' || ic == '=' || ic == 'C' ||ic == 'Q'){ 
   op = (char) ic;
} else (ic == EOF) {
  break; //EOF 
} else {
  fprintf(stderr, "Unexpected input %d\n", ic);
  break;
}

и затем содержит потенциальные пробелы,

Используйте isspace() для проверки пробелов.

while (isspace( (ic = getchar()) )) {
  ;
}
unget(ic, stdin);  // ic is not a white-space - put it baack

число,

Обязательно проверьте scanf() возвращаемое значение. Ключевым атрибутом около "%f" является то, что он занимает первые пробелы, включая '\n'. Чтобы обнаружить '\n' перед числом, был полезен предыдущий цикл isspace(). Теперь код знает, что первый символ, который он должен прочитать, это , а не любой пробел.

float f;
int cnt = scanf("%f", &f);
if (cnt != 1) {
  fprintf(stderr, "Unexpected FP input\n");
  break;
}

больше потенциальных пробелов и разрыв строки.

Помните, что '\n' также является пробелом.

while ((ic = getchar()) != '\n' && isspace(ic)) {
  ;
}
if (ic != '\n') {
  fprintf(stderr, "Unexpected trailing text %d\n", ic);
  break;
}

// Success

Когда код не достигает успеха, код должен использовать весь ввод до '\n' или EOF, прежде чем пытаться проанализировать новую строку текста.

...