Я ищу способ получить ввод с плавающей запятой от пользователя.
Мой способ сделать это – использовать самодельную функцию 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
.
Любой из:
Из них sscanf предлагает самую сильную проверку, так как другие два возвращают действительное двойное значение 0.0, если вход не может быть переустановлен как double, в то время как sscanf () возвращает количество спецификаторов формата, полностью соответствующих входу. Так:
input_valid = (sscanf( arr, "%lf", value ) != 0 ) ;
fgets()
? atof()
. (Спасибо Р. за исправление моего идиотского предложения в части 1)