Записать цифры из символьной переменной в вещественную - C (СИ)
Формулировка задачи:
Как можно решить задачку?
Возможно ли как то изменить тип переменной?
С клавиатуры вводится некая строка ( char str[50] ), нужно проверить, записаны ли в неё только цифры, если записаны, то записать их в переменную типа double.
Решение задачи: «Записать цифры из символьной переменной в вещественную»
textual
Листинг программы
#include <stdio.h>
/* Даёшь велосипеды!!! */
#define my_is_digit(c) ( (c) >= '0' && (c) <= '9' )
int string2double(const char * str, double * val) {
int sign = 1;
int pointFound = 0;
int afterPoint = 0;
double result = 0.0;
if ( *str == '-' ) {
sign = -1;
++str;
}
else if ( *str == '+' )
++str;
while ( *str ) {
if ( *str == '.' ) {
if ( ++pointFound > 1 )
return -1;
}
else if ( ! my_is_digit(*str) )
return -1;
else {
result = result * 10.0 + *str - '0';
if ( pointFound )
++afterPoint;
}
++str;
}
/* и никаких pow из math.h! */
while ( afterPoint-- )
result /= 10.0;
*val = result * sign;
return 0;
}
/* ну нравится мне так строки объявлять...*/
typedef char string_t[256];
#define get_string(s) ( scanf("%255[^\n]%*c", (s)) == 1 )
int main(void) {
string_t str;
double value;
while ( printf("Number: ") && get_string(str) ) {
if ( string2double(str, &value) )
printf("Wrong input!\n");
else
printf("Got number %f\n", value);
}
return 0;
}
Объяснение кода листинга программы
- Преобразование строки в число с плавающей точкой, используя функции стандартной библиотеки языка C.
- Код использует функцию
string2double, которая принимает два аргумента: указатель на строку и указатель на переменную типаdouble. - Функция проверяет, является ли первый символ строки знаком плюс или минус и игнорирует его, если это так.
- Затем функция проверяет, есть ли в строке десятичная точка. Если она есть, функция проверяет, что она встречается не более одного раза.
- Далее функция проверяет каждый символ строки, чтобы убедиться, что он является цифрой. Если это не так, функция возвращает значение, указывающее на ошибку.
- Если все символы являются цифрами, функция преобразует строку в число с плавающей точкой, используя функцию
atof. - Если в строке была десятичная точка, функция выполняет деление на 10 для каждого дополнительного десятичного разряда.
- В конце функция возвращает преобразованное число с плавающей точкой, умноженное на -1, если знак был минус.
- В функции
mainиспользуется циклwhile, который продолжается до тех пор, пока пользователь не введет что-то, что не является числом. - При каждом вводе числа программа отображает его преобразованное значение. Если ввод некорректен, программа выводит сообщение об ошибке.