Функции преобразования строк в числовые значения
Каждая функция в семействе strto* преобразует строку, завершаемую null, в числовое значение. Доступные функции перечислены в следующей таблице.
| Function | Description |
|---|---|
| strtod | Преобразует строку в значение двойной точности с плавающей запятой |
| strtol | Преобразуют строку в целое число типа long |
| strtoul | Преобразуют строку в целое число без знака типа unsigned long |
| _strtoi64 | Преобразует строку в 64-разрядное целое число типа __int64 |
| _strtoui64 | Преобразует строку в беззнаковое 64-разрядное целое число типа __int64 |
wcstod , wcstol , wcstoul и _wcstoi64 — это версии с расширенными символами функций strtod , strtol , strtoul и _strtoi64 соответственно. Строковый аргумент каждой из этих функций для расширенных символов представляет собой строку расширенных символов; каждая функция ведет себя так же, как и эквивалентная функция для однобайтовых символов.
Функция strtod принимает два аргумента: первая — входная строка, а второй — указатель на символ, который заканчивает процесс преобразования. strtol , strtoul _strtoi64 и _strtoui64 принимает третий аргумент в качестве базы чисел для использования в процессе преобразования.
Входная строка представляет собой последовательность символов, которые могут обрабатываться как числовое значение указанного типа. Каждая функция перестает читать строку на первом символе, которую она не может распознать как часть числа. Этот символ может быть завершающим символом NULL. Для strtol , strtoul , _strtoi64 и _strtoui64 этот конечный символ также может быть первым числовым символом, который больше определенного пользователем основания системы счисления или равен ему.
Если предоставленный пользователем указатель на символ завершения преобразования не задан NULL или nullptr во время вызова, указатель на символ, остановивший сканирование, будет сохранен там. Если выполнить преобразование невозможно (не найдены допустимые цифры или указано недопустимое основание), по этому адресу сохраняется значение указателя на строку.
strtod ожидает строку следующего вида:
Может whitespace состоять из пробелов или символов табуляции, которые игнорируются; sign либо плюс ( + ), либо минус ( — ); и digits являются одним или несколькими десятичными цифрами. Если перед символом основания системы счисления нет никаких цифр, то после него должна отображаться хотя бы одна цифра. За десятичными цифрами может следовать показатель степени, который состоит из вводной буквы ( d , D , e или E ) и при необходимости целого числа со знаком. Если экспонентная часть или радикс не отображается, предполагается, что символ радикса следует за последней цифрой в строке. Первый символ, который не соответствует этой форме, останавливает сканирование.
Функции strtol , strtoul , _strtoi64 и _strtoui64 ожидают строку следующего вида:
Если базовый аргумент составляет от 2 до 36, он используется в качестве основы числа. Если это значение 0, для определения базы используются начальные символы, на которые ссылается указатель завершения преобразования. Если первый символ равен 0, а второй символ не является x или X, строка интерпретируется как восьмеричное целое число; в противном случае он интерпретируется как десятичное число. Если первый символ — 0, а второй символ равен x или X, строка интерпретируется как шестнадцатеричное целое число. Если первый символ — от 1 до 9, строка интерпретируется как десятичное целое число. Буквам от а до z (или от А до Z) присваиваются значения от 10 до 35. Допускаются только буквы с присвоенными значениями меньше base . strtoul и _strtoui64 допускают в качестве префикса знак плюса ( + ) или знак минуса ( — ); знак минуса перед числом показывает, что возвращаемое значение отрицательное.
Выходное значение зависит от параметра LC_NUMERIC категории языкового стандарта. Дополнительные сведения см. в разделе setlocale . Версии этих функций без суффикса _l используют текущий языковой стандарт для данного поведения, зависимого от языкового стандарта. Версии с суффиксом _l идентичны, однако они используют переданный параметр языкового стандарта.
Если значение, возвращаемое этими функциями, приведет к переполнению или переполнению или, когда преобразование невозможно, возвращаются специальные значения регистра, как показано ниже.
| Функция | Condition | Возвращенное значение |
|---|---|---|
| strtod | Overflow | +/- HUGE_VAL |
| strtod | Потеря точности или отсутствие преобразования | 0 |
| strtol | Переполнение + | LONG_MAX |
| strtol | Переполнение – | LONG_MIN |
| strtol | Потеря точности или отсутствие преобразования | 0 |
| _strtoi64 | Переполнение + | _I64_MAX |
| _strtoi64 | Переполнение – | _I64_MIN |
| _strtoi64 | Преобразование не выполнено | 0 |
| _strtoui64 | Overflow | _UI64_MAX |
| _strtoui64 | Преобразование не выполнено | 0 |
_I64_MAX , _I64_MIN и _UI64_MAX определены в .
Функции wcstod , wcstol , wcstoul , _wcstoi64 и _wcstoui64 — это, соответственно, версии функций strtod , strtol , strtoul , _strtoi64 и _strtoui64 для расширенных символов; указатель на аргумент конца преобразования в каждой из этих функций для расширенных символов представляет собой строку расширенных символов. В остальном каждая из этих функций для расширенных символов работает так же, как и ее аналог для однобайтовых символов.
Преобразовать строку в число (Си)
Задача: Написать и протестировать функцию my_stoi(n, str) , которая преобразует строку десятичных цифр в целое число. Решение: Пусть дана строка s = «46354» . Заведем целое число ( value ), изначально равное нулю. Последовательно обрабатываем символы строки, каждый раз умножаем value на 10 чтобы перейти к следующему десятичному разряду и добавляем очередную цифру. так для этого примера результаты будут формировать следующим образом:
| Номер итерации цикла | цифра | value |
| 1 | 4 | 0 *10 + 4 = 4 |
| 2 | 6 | 4*10 + 6 = 46 |
| 3 | 3 | 46*10 + 3 = 463 |
| 4 | 5 | 463*10+5 = 4635 |
| 5 | 4 | 4635*10 + 4 = 46354 |
Согласно прототипу, функция должна принимать число ( n ) и формировать строку ( str ). Однако, что если в строке есть символы, отличные от цифр? – При этом надо как-то вернуть ошибку в вызывающий код. Пусть функция возвращает единицу если число успешно распознано и ноль в противном случае. Для этого при обработке строки каждый символ проверяется на принадлежность диапазону [‘0’, ‘9’] . Кроме того, числа могут быть со знаком. Знаки – плюс и минус могут находиться только в начале строки. Эта ситуация обрабатывается – просматривается нулевой символ строки и если это знак – то счетчик символов увеличивается и переменная sign принимает значение ноль или единица. Если же sign хранит единицу – то перед возвратом результата функции полученное число умножается на ( -1 ). Исходный код:
#include #include int my_stoi(int* n, char *s) < const int size_s = strlen(s); int sign = 0; int i = 0; if (s[0] == '+') i = 1; if (s[0] == '-') < i = 1; sign = 1; >int value = 0; for (; i < size_s; ++i) < if (s[i] < '0' || s[i] >'9') < return 0; >int digit = s[i] - '0'; value = value * 10 + digit; > if (sign == 1) value = value * -1; *n = value; > int main() < char str[255]; int n; printf("enter number: "); scanf("%255[^\n]", str); if (my_stoi(&n, str) == 0) < printf("fail"); >else < printf("result by pro-prof.com: %d", n); >return 0; >
Просмотр 0 веток ответов
C перевод строки(char) в число(int)
Переменная not_num содержит строку из трех символов-цифр, например «528» . Необходимо получить из этой строки соответствующее ему число и присвоить его переменной num . Вывести на экран результат выражения num – 10. (Подсказка: строка — это массив символов, следовательно, вы можете извлекать символы цифр по их индексам; при вычислении числа первый символ массива, преобразованный в число, будет означать количество сотен, второй — десятков, а третий — единиц.)
Отслеживать
задан 5 янв 2017 в 11:34
187 1 1 серебряный знак 12 12 бронзовых знаков
Для любого символа c в диапазоне 0..9 числовое значение может быть получено как c — ‘0’ . Можно воспользоваться этим.
5 янв 2017 в 11:45
Так а в чем проблема? Почему просто не воспользоваться функцией strtoul ?
16 июл 2017 в 21:27
@AnT, исходя из подсказки в тексте вопроса проблема в отсутствии представления о кодировках символов (впрочем, семестр уже явно закончился)
16 июл 2017 в 21:36
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
char not_num — может, вы все же имели в виду char*not_num ?
Посмотррите на функции типа atoi или strtol .
P.S. Первое уточнение (интересно, сколько их еще будет? :))
num = 0; char* s = not_num; while(*s)
Отслеживать
ответ дан 5 янв 2017 в 11:38
219k 15 15 золотых знаков 119 119 серебряных знаков 230 230 бронзовых знаков
Вот задание: Переменная not_num содержит строку из трех символов-цифр, например «528». Необходимо получить из этой строки соответствующее ему число и присвоить его переменной num. Вывести на экран результат выражения num – 10. (Подсказка: строка — это массив символов, следовательно, вы можете извлекать символы цифр по их индексам; при вычислении числа первый символ массива, преобразованный в число, будет означать количество сотен, второй — десятков, а третий — единиц.)
5 янв 2017 в 11:40
И там нету нечего по поводу сторонних функции
5 янв 2017 в 11:42
А что в задании написали вы? 🙂 Плохое ТЗ — и результат ХЗ.
5 янв 2017 в 11:43
@AntonShchyrov а что тут нечитабельно? *s++ это классика имхо. А вот скобки можно и убрать)
5 янв 2017 в 11:56
@Harry я ждал тут ответа 100*a[0]+10*a[1]+a[2]-5328 )
5 янв 2017 в 12:07
int num; num = (not_num[0] - '0') * 100 + (not_num[1] - '0') * 10 + (not_num[2] - '0') printf("%d\n", num - 10);
Как перевести строку в число 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; >