Как читать в отрицательном двойном с scanf () в C? - PullRequest
0 голосов
/ 30 мая 2010

Я изучаю основы C и пишу простой решатель уравнений первого порядка. Я хочу, чтобы вход был точно ax + b = c или ax-b = c, где a, b, c двойного типа. Я использую функцию scanf () для чтения в пользовательском вводе и проверки правильности формы. Однако, если я введу отрицательное двойное число, скажем -4,6, в качестве «a» в уравнении, scanf() не будет правильно читать a, b, c. Я использую% lf внутри scanf(). Как мне тогда прочитать отрицательный двойной? Большое спасибо.

Мой код:

#include <stdio.h>
int main(void)
{
    double a,b,c,x;
    printf("Enter the expression:\n");
    if (scanf("%lfx%lf=%lf", &a, &b, &c) == 3)
    {
    x = (c - b)/a;
    printf("x=%.2f\n", x);
    }
    else if (scanf("%lfx+%lf=%lf", &a, &b, &c) == 3)
    {
        x = (c - b)/a;
        printf("x=%.2f\n", x);
    }
    else
        printf("Invalid expression\n");
    return 0;

}

1 Ответ

2 голосов
/ 30 мая 2010

Одна из трудностей, связанных с использованием scanf() напрямую (вместо, скажем, fgets() и sscanf()), заключается в том, чтобы выяснить, к чему это привело, когда оно пошло не так.

Вы также можете помочь себе, заметив, что scanf() возвращает количество успешных конверсий. Вы должны тестировать:

if (scanf("%lfx+%lf=%lf", &a, &b, &c) != 3)
    ...something went wrong...
else
   ...more code using successfully read data...

То, что у вас есть, должно работать нормально, если данные верны и вы не столкнетесь с EOF. То есть звонок правильно сформирован; контекст, в котором это происходит, может быть не таким чистым.

Кроме того, поскольку вы хотите разрешить '+' или '-' между двумя терминами, вам действительно нужно перейти к механизму токенизации, который читает следующий токен (возможно, отрицательное число, 'x', a ' + 'или' - 'и другое (возможно, отрицательное) число). Затем вы можете интерпретировать это. Использование scanf() - это катастрофа, если пользователь ввел «-2.3x-4.5 = 9.1», тогда, когда сканирование не удалось включить (в секунду) «-», у вас нет возможности вернуться назад и перечитать все данные с помощью отрицательный формат. Или вам нужно прочитать символ разделителя '+' или '-' в значение символа.

...