Преобразовать строку в число
Всем привет. Помогите решить такую задачу. Дана строка, содержащая вещественное число. Преобразовать строку в число двойной точности. На первый взгляд не сложная, но нельзя использовать библиотеки stdlib.h и string.h
Вот я тут попытался реализовать подобную функцию пока с целыми числами, но выводит ерунду.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
#include #include int main (void) { setlocale(LC_ALL, "RU"); printf("Введите весчественное число:"); char str[50]; scanf("%s", &str); int i,j,n; for (i = 0; str[i] != '\0'; i++) { n++; putchar(str[i]); } printf("\n"); printf("%d\n",n); int arr[n]; for (i=0; in; i++); { arr[i]=str[i] - '0'; printf("%d", arr[i]); } printf("\n"); return 0; }
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Преобразовать строку в целое число
Даны две строки с1 и с2, содержащие до пяти цифр каждая. Преобразовать их к данным целого типа.

Преобразовать число с плавающей точкой в строку
Здравствуйте! Как преобразовать число с плавающей точкой в строку(чтобы в строке присутствовала.

Преобразовать число типа double в строку символов
Здравствуйте, эта программа преобразует число типа double в строку символов, с определенным кол-вом.

Преобразовать строку цифр в число типа int
Здравствуйте! Помогите поправить код функции, не работает при работе с ведущим знаком ‘-‘.
64 / 64 / 20
Регистрация: 16.07.2012
Сообщений: 147
Beauty69,
1. забыли занулить n (n=0)
2. строка 19: «;» не нужна
3. строка 18: не все компиляторы поймут такое выделение памяти. В стандартных компиляторах лучше выделять динамически память
1 2 3 4
#include . int *arr; arr = (int *) malloc (n*sizeof(int));
или просто:
int arr[50];
Регистрация: 11.12.2012
Сообщений: 42
я выше писал уже, что нельзя использовать библиотеки stdlib.h и string.h, но спасибо за мощь.
64 / 64 / 20
Регистрация: 16.07.2012
Сообщений: 147
Так не используйте! Второй вариант вам подходит.
153 / 133 / 9
Регистрация: 21.10.2012
Сообщений: 404
1 2 3 4 5 6 7 8 9 10
nt atoib(char* s, int base) // преобразует строку в число по основанию base { int n = 0; while( *s >= '0' && *s '9' ) { n *= base; n += *s++; n -= '0'; } return n; }
Нарушитель
8920 / 4799 / 1111
Регистрация: 12.03.2015
Сообщений: 22,629
1 2 3
double x; scanf("%lf", &x); printf("%lg\n", x);
![]()
![]()
11125 / 6083 / 1663
Регистрация: 18.10.2014
Сообщений: 15,286
Сообщение от Beauty69 
Преобразовать строку в число[. ]но нельзя использовать библиотеки stdlib.h и string.h
1 2 3 4 5
#include . char str[] = "3.14159"; double d; sscanf(str, "%lf", &d);
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

С помощью рекурсии преобразовать строку десятичных цифр в целое число
Написать и протестировать рекурсивную функцию STOI(n, str), которая преобразует строку десятичных.
Дана строка S и число N. Преобразовать строку S в строку длины N следующим образом — см. текст задачи
Дана строка S и число N. Преобразовать строку S в строку длины N следующим образом: если длина.

Преобразовать число в строку записать строку в обратном порядке
Дано шестизначное натуральное число. Преобразовать его в строку. Записать полученную строку в.

Дана строка S и число N. Преобразовать строку S в строку длины N
Дана строка S и число N. Преобразовать строку S в строку длины N следующим образом: если длина.
Как перевести строку в число
Имеется ли в с++ готовая функция которая бы могла попытаться преобразовать строку в число ( double к примеру), и при неудаче возвращала бы не ноль, а к примеру NAN ?
Отслеживать
6,853 2 2 золотых знака 23 23 серебряных знака 43 43 бронзовых знака
задан 11 мая 2018 в 20:03
Михаил Дёмин Михаил Дёмин
3 2 2 бронзовых знака
Да такое без проблем написать самому.
11 мая 2018 в 20:10
@harry, ну тут скорее вопрос лени. просто есть atof, и она почему-то при ошибочном вводе возвращает 0. Уже ли нет аналогов?
11 мая 2018 в 20:23
11 мая 2018 в 20:30
Конечно, есть. См. man strtod
11 мая 2018 в 20:58
@Михаил Дёмин: atof ? Функция atof не имеет практических применений. Базовой функцией перевода строки в double является функция strtod , которая сообщает об ошибках через errno и указатель. Вы пробовали пользоваться strtod ? А то складывается впечатление, что вы пытаетесь решить несуществующую проблему.
Как перевести строку в число c
Нередко в программах встречается ситуация, когда надо преобразовать число в строку или строку в число. Для этой цели в стандартной библиотеке языка С определены функции strtol() и snprintf() .
Из строки в число. strtol
Функция strtol() преобразует строку в число типа long int . Функция определена в заголовочном файле stdlib.h и имеет следующий прототип:
long strtol(const char *restrict str, char **restrict str_end, int base);
- str — строка с числом, которое надо преобразовать в числовой тип. Ключевое слово restrict указывает компилятору оптимизировать код и что никакой другой параметр не будет указывать на адрес данного параметра.
- str_end — указатель на последний символ строки. Данный параметр можно игнорировать, передавая ему значение NULL
- base — основание, система исчисления, в которую надо преобразовать данные (значение от 2 до 36).
Результатом функции является преобразованное число типа long .
Например, преобразуем строку в число в десятичной системе:
#include #include int main(void) < const char * str = "24 flowers"; long result = strtol(str, NULL, 10); printf("Result: %ld\n", result); // Result: 24 return 0; >
В примере выше второй параметр функции никак не использовался — мы ему передавали значение NULL , и функция нормально работала. Однако он может быть полезен, если нам надо получить остаток строки, которая идет после числа:
#include #include int main(void) < const char * str = "24 flowers"; char* str_end; long result = strtol(str, &str_end, 10); printf("Result: %ld\n", result); // Result: 24 printf("Rest of the string:%s\n", str_end); // Rest of the string: flowers return 0; >
Из числа в строку. snprintf
Функция snprintf() преобразует число в отформатированную строку. Функция определена в заголовочном файле stdio.h и имеет следующий прототип:
int snprintf(char *restrict str_buffer, size_t buffer_size, const char *restrict format, . );
- str_buffer — строка, в которую помещается преобразованное число.
- buffer_size — максимальное количество символов строки. Функция записывает в строку buffer-size — 1 байт и добавляет концевой нулевой байт
- format — задает формат преобразования в строку.
При успешном преобразовании функция возвращает количество символов, записанных в строку (исключая концевой нулевой байт). При неудачном преобразовании возвращается отрицательное число.
#include int main(void) < int number = 354; char str [10]; snprintf(str, sizeof str, "%d", number); printf("Result: %s\n", str); // Result: 354 return 0; >
При этом строка форматирования может содержать множество параметров:
#include int main(void) < int count = 3; double price = 79.99; char str [50]; snprintf(str, sizeof str, "Count: %d \tPrice: %.2f", count, price); printf("%s\n", str); // Count: 3 Price: 79.99 return 0; >
Как перевести строку в число c
Для того, чтобы точно знать, сколько выделить памяти для хранения строки, часто нам нужно получить длину конкретной строки. Разного рода функции иногда предлагают не просто ввести строку, а указать какое количество символов из неё мы хотели бы использовать. Чаще всего мы хотим ввести всю строку, поэтому есть смысл не считать вручную, а просто измерить длину строки и подставить в функцию.
#include
#include
void main()
char *str = «машина»;
>
Функция strlen() возвращает количество символов в строке. Например для строки «машина» она вернёт число 6.
Вопрос: Как сложить две строки?
Помните мы писали программу, которая c нами здоровалась? Там была строка:
И умная программка добавляла в конец ваше имя.
А если мы хотим сложить две строки, которые заранее не известны? Для этого в программировании применяется операция «склеивания» — конкатенции (знаю — жуткое слово!), которая позволяет просто сложить две строки вместе и получить одну. В языке СИ такой операции нет, но зато в библиотеке string.h есть специальная функция strncat(), которая позволяет склеивать исходную строку с подстрокой.
void main()
char kuda[20];
char *otkuda=»Федерация»;
strcpy(kuda, «Российская «); //копирование в строку kuda
strncat(kuda, otkuda, strlen(otkuda)); //склеиваем две строки, результат — в строке kuda
cout
Функция strcpy(to, from) копирует строку from в строку to. Кстати, это ещё один из способов присвоения строке значения. Функция strncat объединяет две строки, дописывая в конец строки kuda строку otkuda. Этот процесс можно сравнить с локомотивом, в конец которого на товарной станции прицепляют ещё один вагончик. Для каждого нового вагона нам понадобится функция strncat.
Обратите внимание, что у функции strncat три аргумента. Функция гибка и позволяет скопировать не всю строку, а только её часть. Если мы точно знаем сколько символов в строке otkuda, можно третьим аргументом задать число, но проще всего измерить длину строки с помощью известной нам уже функции strlen().
Вопрос: КАК из строки сделать число?
Для чего это нужно? Часто программа получает данные от пользователя в виде строки. Например, данные полученные из текстовых полей Windows — всегда строковые. И даже если пользователь ввёл число, оно всё равно будет представлено, как строка. Чтобы подставить это число в форумулу, вам придётся его конвертировать в строку.
void main()
int n;
char *str=»123456″; //объявляем строку
n=atoi(str); //конвертируем в число
В некоторых классах Windows есть методы, позволяющие сразу получать целые числа из текстовых полей, но метода, позволяющего сразу считывать числа с плавающей запятой, нет, поэтому в любом случае вам понадобится конвертирование. Для преобразования строки в число с плавающей запятой существует функция atof(char *str), которая по своему применению аналогична.
В этом примере мы используем новую для нас библиотеку «stdlib.h» — в данной библиотеке содержится большинство функций конвертирования, а также множество других функций самого разного назначения. Это библиотека очень широкого профиля.
После получения строки из поля ввода, конвертирования в число, подстановки в формулу, или куда-то ещё, ответ зачастую придётся выводить в какое-нибудь окно. Естественно, напрямую число в окно мы не сможем — оно нас просто не поймёт, и заставит выполнять обратное преобразование — теперь уже из числа в строку.
Иногда ответ должен сопровождаться каким-то текстом, например: «U = 127,24 v «. Для создания такого дружественного интерфейса удобнее использовать не саму операцию конвертирования, а записать в один буфер и число и текст.
Функция sprintf аналогична функции printf, с той лишь разницей, что вывод информации осуществляется не в какое-то устройство вывода, а в буфер данных. Используя эту функцию, мы сможем комбинировать различные типы данных в любой последовательности.
void main()
char buffer[25]; //строка, длиной 25 символов
const double f=127.24; //число с плавающей точкой
sprintf(buffer, «U = %3.2f V\n», f);
Однако, если нам необходимо просто преобразовать число в строку, можно использовать функцию конвертирования, описанную в следующем разделе.
Вопрос: КАК из числа сделать строку?
#include
void main()
<
int number = 123456;
char *string;
itoa(number, string, 10); //число 10 заботится о добавлении минуса отрицательными числам
printf(«Число = %d Строка = %s», number, string);
>
Конвертирование — очень важная задача, и в математических программах без неё никуда. Если ваша программа что-то считает, получая данные от пользователя, вы будете использовать конвертирование постоянно.
Вопрос: КАК что-то найти в строке?
Иногда нам нужно проверить строку на наличие в ней какого-нибудь символа. Например, если пользователь вводит свой E-mail хорошо бы проверить, есть ли в нём символ «at», который в России чаще называют собакой @? Кроме того, в каждом адресе электронной почты есть по крайней мере одна точка.
Следующая программа последовательно проверяет наличие в строке знака «@» и точки.
void main()
char *ptr;
printf(«Введите E-mail: «);
scanf(«%s», email);
ptr = (char *)memchr(email, ‘@’, strlen(email));
ptr = (char *)memchr(email, ‘.’, strlen(email));
printf(«\n%s не является E-mail адресом», email);
>
else printf(«\nE-mail адрес: %s успешно введён!», email);
Переменная flag — своеобразный выключатель, который имеет два состояния «истина» и «ложь». Такие переменные программисты часто так и называют «флагами» или «флажками». Они обозначают состояние. Первоначально переменная flag = 0. Но если программа не обнаруживает в строке знака «@» или точки, значение flag поменяется на 1. Условий может быть и больше (например, мы могли бы проверить, есть ли какие-то символы до знака «@» и находится ли точка после знака @, а не до него), однако работать они будут по тому же принципу.
В конце программы проверяется значение переменной flag, и если она изменила своё значение, E-mail адрес признаётся некорректным.
При разработки больших программ подобные проверки необходимо производить буквально на каждом шагу, они делают программу более надёжной и отказоустойчивой, страхуя нас от недопустимого типа данных. Согласитесь, если мы попытаемся отправить письмо на некорректный адрес, приятного в этом будет мало! Однако во избежание увеличения кода, мы заключим процедуру проверки адреса в маленькую проверочную функцию вида:
int IsEmail(char *email)
которая будет возвращать 0, если E-mail адрес был введён недостаточно корректно.
Часто производители программного обеспечения требуют регистрации и предлагают пользователю заполнить форму, в которой в том числе есть просьба указать электронный адрес. Знать ваш E-mail адрес производителю жизненно важно, чтобы впоследствии заваливать вас своей рекламой. Поэтому если вы введёте свой адрес неправильно или вообще проигнорируете эту просьбу, электронная форма откажется вас регистрировать.
Функция поиска в строке незаменима при работе с файлами (а храним мы данные именно в них — лучшего пока ничего не придумали). Есть и другие применения поиска: когда программа предлагает пользователю сохранить файл, с которым он работал, необходимо ввести его имя. Однако пользователи попадаются с совершенно разным профессиональным уровнем: кто-то вводит имена файлов с расширениями: «picture.bmp» , а кто-то и не знает, что такое расширение. Нужно предусмотреть оба случая, и в случае, если пользователь просто ввёл имя: «моя картинка. » добавить к этому имени расширение. Пример решения этой проблемы приведён ниже.
#include
#include
#include
void main()
char *ptr;
printf(«Введите имя файла: «);
scanf(«%s», filename);
ptr = (char *)memchr(filename, ‘.w’, strlen(filename));
strncat(filename, «.bmp», 4);
>
printf(«\nИмя файла: %s», filename);
Вопрос: КАК сравнить две строки?
Часто, когда вы получаете от пользователя не числовые данные, а строковые, вам надо сравнить строку с уже имеющимся эталоном. Допустим, вы хотите, чтобы пользователь зарегистрировал свою версию вашей программы и ввёл пароль. Для этого и нужна функция сравнения строк strncmp(). Она возвращает ноль, если строки одинаковы.
Следующая ниже программа вполе функциональна. Она ни за что не пропустит построннего на ваш компьютер. При желании, вы можете включить её в файл autoexec.bat. Доступ посторонним будет закрыт навеки! (Конечно если вы всё ещё пользуетесь Windows 98).
char *password=»BUSH»; //наш пароль
char enter[256]; //строка, которую будет вводить пользователь
do printf(«Введите пароль: «);
scanf(«%s», enter);
//сравниваем две строки по всей длине
ptr = strncmp(enter, password, strlen(password));
//если строки одинаковы
if (ptr == 0)
printf(«Доступ открыт»);
return(0);
>
else printf(«Введён неверный пароль!»);
>
>while(ptr!=0); //цикл повторяется, пока ptr не будет =0.
return 0;
>
Конечно в реальности никто не будет прописывать пароль в коде программы, иначе мало-мальски грамотный хаккер запросто его оттуда «достанет». Настоящие программы генерируют пароль из имени пользователя, таким образом, чтобы пароли никогда не повторялись. Также популярна онлайн регистрация, при которой пользователь получает пароль, регистрируясь на сайте фирмы. Получив такой пароль, программа преобразует его по сложному алгоритму и проверяет на соответствие какому-то правилу — например сумма кодов символов должна всегда быть равна 100 (или что-то в этом роде). Дружеский совет — никогда не давайте «говорящие» пароли, как в данном примере. Такие пароли разгадываются элементарно, путём простого перебора символов. Хороший пароль должен содержать цифры и буквенные символы разного регистра, также неплохо было бы включить в него специальные символы. В результате должно получиться нечто вроде: «$&weh!60Om17rv».
Подытожим. Мы освоили достаточно операций для работы со строками. Их хватит на первый и на второй случай. Если же вам понадобится что-то большее, читайте описания функций библиотеки string.h. В справочной системе.