преобразование строки в двойную

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

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

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

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?

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

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

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

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

 if (*end != '\0') // Handle malformed input 

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

Любой из:

  • strtod ()
  • atof ()
  • sscanf ()

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

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

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