преобразование строки в двойную - PullRequest
1 голос
/ 30 ноября 2010

Я ищу способ получения ввода с плавающей запятой от пользователя.

Мой способ сделать это - использовать самодельную функцию getstrn и подключить ее к другой функции, которая преобразует строку в двойную.

Мой сейф получает строку:

void safeGetString(char arr[], int limit){
    int c, i;
    i = 0;
    c = getchar();
    while (c != '\n'){
        if (i < limit -1){
            arr[i] = c;
            i++;
        }
        c = getchar();
    }
    arr[i] = '\0';
}

Как лучше написать эту функцию get_double?

Ответы [ 4 ]

12 голосов
/ 30 ноября 2010

Попробуйте функцию strtod:

char *end;
double num = strtod(arr, &end);

Конец будет указывать после последнего обработанного символа. Вы можете установить секунду на NULL, если вам это безразлично. Или вы можете использовать atof: atof(str) эквивалентно strtod(str, (char **)NULL).

Но вам следует позаботиться, так как вы можете проверить, не искажен ли ввод:

if (*end != '\0')
  // Handle malformed input
4 голосов
/ 30 ноября 2010

Используйте strtod, вот для чего оно. И fgets может заменить вашу safeGetString функцию.

3 голосов
/ 30 ноября 2010

Любое из:

Из этих sscanf предлагает самую сильную проверку, так как другие два возвращают допустимое двойное значение 0.0, если вход не может быть интерпретирован как double, в то время как sscanf () возвращает количество спецификаторов формата, успешно сопоставленных с входом. Итак:

input_valid = (sscanf( arr, "%lf", value ) != 0 ) ;
2 голосов
/ 30 ноября 2010
  1. Почему вы не используете fgets()?
  2. Вы ищете atof().

(Спасибо Р. за исправление моегоидиотское внушение в части 1)

...