C++ atof()
Содержание:
Преобразование строки в целое: stoi( )
Скрыть рекламу в статье
Преобразование строки в целое: stoi( )
Сначала опишем, каким должен быть вход и выход у этой функции. Вход будет символьной строкой, поэтому stoi( ) будет иметь символьную строку в качестве аргумента. На выходе должно быть получено два значения: состояние и преобразованное целое число. Мы применяем return для состояния и поэтому должны использовать указатель для возврата другого значения. Таким образом, появится второй аргумент — указатель на целое число. Скелет нашей функции будет выглядеть примерно так:
stoi(string, intptr)
char string; /* вводимая строка * /
int *intptr; /* указатель на переменную, получающую целое значение*/
{
int status;
…
return(status);
}
Прекрасно, а что можно сказать об алгоритме выполнения преобразования? На некоторое время проигнорируем знак и предположим, что строка содержит только цифры. Возьмем первый символ и преобразуем его в числовой эквивалент. Предположим, это символ ‘4’. Он имеет в коде ASCII числовое значение 52 и в таком виде запоминается. Если мы из него вычтем 48, то получим 4, т. е.
‘4’ — 48 = 4
Но 48 — это ASCII-код символа ‘0’, поэтому
‘4’ — ‘0’ =4
Действительно, этот последний оператор был бы справедлив в любом коде, в котором используются последовательные числа для представления последовательных цифр. Поэтому если num- числовое значение, a chn- символ цифры, то
num = chn — ‘0’;
Итак, мы используем этот метод для преобразования первой цифры в число. Теперь возьмем следующий элемент массива. Если он », то у нас была только одна цифра, и мы закончили работу. Предположим, однако, что этот элемент ‘3’. Превратим его в числовое значение 3. Но если оно равно 3, то 4 должно было быть числом 40, а оба числа вместе 43:
num = 10 * num + chn — ‘0’;
Теперь просто продолжим этот процесс, умножая старое значение num на 10 каждый раз, когда мы находим следующую цифру. Наша функция будет использовать этот метод.
Вот определение функции stoi( ). Мы храним ее в том же файле, что и getint( ), так что она может использовать те же самые директивы #define.
/* превращает строку в целое число и сообщает о состоянии */
stoi(string, intptr)
char string; /* строка, подлежащая преобразованию в целое*/
int *intptr; /* значение целого */
{
int sign = 1; /* проверяет наличие знака + или — */
int index = 0;
if(string == ‘-‘ || string == ‘+’)
sign = (string == ‘-‘) ? -1 : 1; /* установить знак */
*intptr = 0; /* начальное значение */
while(string >= ‘0’ && string <= ‘9’)
*intptr = 10 * (*intptr) + strmg — ‘0’;
if(string == »)
{
*intptr = sign * (*intptr);
return(YESNUM); }
else /* найден символ, отличный от цифры, знака или ‘ ‘ */
return(NONUM);
}
Оператор while продолжает работу, преобразуя цифры в числа, пока не достигнет нецифрового символа. Если это символ», все прекрасно, потому что он означает конец строки. Любой другой нецифровой символ отсылает программу кelse для сообщения об ошибке.
Стандартная библиотека языка Си содержит функцию atoi( ) (перевод кода ASCII в целое число), очень похожую на stoi( ). Основная разница заключается в том, что stoi( ) проверяет на нецифровые строки, a atoi( ) использует return вместо указателя, для возврата числа, и пропускает пробел, как мы это делали в getint(). Можно было бы осуществить все проверки состояния в getint( ) и использовать atoi( ) вместо stoi( ), но мы полагаем, что было бы интереснее разрабoтать нашу собственную версию.
Оглавление книги
Example 1: How atof() function works?
When you run the program, the output will be:
Number in String = -32.40 Number in Double = -32.4
A valid floating-point value for atof() function consists of an optional + or — sign followed by one of the following sets:
-
For decimal floating-point value:
- A group of decimal digits (0-9), optionally containing a decimal point (.). For example: 9.056, -0.013, etc.
- An optional exponent part ( or ) followed by an optional + or — sign and non-empty sequence of decimal digits. For example: 1.23455e+009, 5.23e-018, etc.
-
For hexadecimal floating-point value:
- A string starting with or , followed by a non-empty sequence of hexadecimal digits, optionally containing a decimal point (.). For Example: 0xf1b, -0xb1b.51, etc.
- An optional exponent part ( or ) followed by an optional + or — sign and non-empty sequence of hexadecimal digits. For Example: 0x51c.23p5, -0x2a.3p-3, etc.
-
Infinity:
INF or INFINITY (ignoring case). For Example: -iNf, INfINiTy, etc.
-
NaN (Not a Number):
NAN or NANsequence (ignoring case) where sequence is a sequence of characters consisting only of alphanumeric characters or the underscore (_).The result is a quiet NaN. For Example: Nan, NaN12, etc.
Remarks
Except for the parameters and return value, the _itoa_s and _itow_s function families have the same behavior as the corresponding less secure _itoa and _itow versions.
In C++, using these functions is simplified by template overloads; the overloads can infer buffer length automatically (eliminating the need to specify a size argument) and they can automatically replace older, non-secure functions with their newer, secure counterparts. For more information, see Secure Template Overloads.
The debug library versions of these functions first fill the buffer with 0xFE. To disable this behavior, use _CrtSetDebugFillThreshold.
The CRT includes convenient macros to define the size of the buffer required to convert the longest possible value of each integer type, including the null terminator and sign character, for several common bases. For information, see .
By default, this function’s global state is scoped to the application. To change this, see Global state in the CRT.
Generic-Text Routine Mappings
| Tchar.h routine | _UNICODE and _MBCS not defined | _MBCS defined | _UNICODE defined |
|---|---|---|---|
| _itot_s | _itoa_s | _itoa_s | _itow_s |
| _ltot_s | _ltoa_s | _ltoa_s | _ltow_s |
| _ultot_s | _ultoa_s | _ultoa_s | _ultow_s |
| _i64tot_s | _i64toa_s | _i64toa_s | _i64tow_s |
| _ui64tot_s | _ui64toa_s | _ui64toa_s | _ui64tow_s |
ПРЕОБРАЗОВАНИЯ СИМВОЛЬНЫХ СТРОК: atoi( ), atof( )
Скрыть рекламу в статье
ПРЕОБРАЗОВАНИЯ СИМВОЛЬНЫХ СТРОК: atoi( ), atof( )
Использование scanf( ) для считывания цифровых значений не является самым надежным способом, поскольку scanf( ) легко внести в заблуждение ошибками пользователей при вводе чисел с клавиатуры. Некоторые программисты предпочитают считывать даже числовые данные как символьные строки и преобразовывать строку в соответствующее числовое значение. Для этого используются функции atoi( ) и atof( ). Первая преобразует строку в целое, вторая — в число с плавающей точкой. Вот (рис. 15.4) образец их использования:
/* включение atoi( ) */
#include <stdio.h>
#define issign(c) (((с) == ‘-‘ || (с) == ‘+’) ? (1) : (0))
#define SIZE 10
#define YES 1
#define NO 0
main( )
{
char ch;
static char number;
int value;
int digit = YES;
int count = 0;
puts(» Введите, пожалуйста, целое.»);
gets(number);
if(number != »)
{ puts(«Слишком много цифр; вы уничтожили меня.»);
exit(1);
} while((ch = number) !=’0′ && digit == YES)
if(!issign(ch) && iisdigit(ch) && !isspace(ch))
digit = NO;
if(digit == YES)
{ value = atoi(number);
printf(» Число было %d.n» , value); }
else
printf(» Это не похоже на целое.»);
}
РИС. 15.4. Программа использования atoi( ).
Мы предусмотрели проверку некоторых ошибок. Во-первых, следует посмотреть, умещается ли входная строка в предназначенном для нее массиве. Поскольку number является статическим символьным массивом, он инициализируется нулями. Если последний элемент массива не является нулем, значит что-то неверно, и программа прекращает работу. Здесь мы использовали библиотечную функцию exit( ), которая выводит нас из программы. Немного позже мы расскажем кратко об этой функции.
Затем посмотрим, не содержит ли строка что-нибудь кроме пробелов, цифр и алгебраических знаков. Функция отвергает такие строки, как «дерево» или «1.2Е2». Ее устраивает смесь, подобная «3 — 4 + 2», но atoi( ) будет выполнять дальнейший отбор. Вспомним, что ! является операцией отрицания, поэтому !isdigit(c) означает: «с не является цифрой». Строка
value = atoi(nuinbcr);
показывает, как используется функция atoi( ). Ее аргумент является указателем символьной строки; в этом случае мы применили имя массива number. Функция возвращает целое значение для такой строки. Таким образом, «1234» является строкой из четырех символов и переводится в 1234 — единое число типа int.
Функция atoi( ) игнорирует ведущие пробелы, обрабатывает ведущий алгебраический знак, если он есть, и обрабатывает цифры вплоть до первого символа, нс являющегося цифрой. Поэтому наш пример «3 — 4 + 2» был бы превращен в значение 3. Посмотрите «Вопросы» в конце главы для возможного применения этой функции.
Функция atof( ) выполняет подобные действия для чисел с плавающей точкой. Она возвращает тип double, поэтому должна быть описана как double в использующей ее программе.
Простые версии atof( ) будут обрабатывать числа вида 10.2, 46 и — 124.26. Более мощные версии преобразуют также экспоненциальную запись, т. е. числа, подобные 1.25Е — 13.
Ваша система может также иметь обратные функции, работающие в противоположном направлении. Функция itoa( ) будет преобразовывать целое в символьную строку, а функция ftoa( ) преобразовывать число с плавающей точкой в символьную строку.
Оглавление книги
СинтаксисSyntax
ПараметрыParameters
valuevalueДвойное и длинное двойное значение, а также число с плавающей запятой формируются путем преобразования строки в значение с плавающей запятой.The double, long double, or float value that’s produced by converting the string to a floating-point value. Эти значения упаковываются в структуре.These values are wrapped in a structure.
strstrСтрока для синтаксического анализа, которую необходимо преобразовать в значение с плавающей запятой.The string to be parsed to convert into a floating-point value.
localelocaleИспользуемый языковой стандарт.The locale to use.
RemarksRemarks
Эти функции преобразуют строку в значение с плавающей запятой.These functions convert a string to a floating-point value. Разница между этими функциями и семейством функций атоф заключается в том, что эти функции не создают код с плавающей запятой и не вызывают исключения оборудования.The difference between these functions and the atof family of functions is that these functions do not generate floating-point code and do not cause hardware exceptions. Вместо этого условия ошибок помечаются как коды ошибок.Instead, error conditions are reported as error codes.
Если строка не имеет допустимой интерпретации в качестве значения с плавающей запятой, значение устанавливается равным нулю, а возвращаемое значение равно нулю.If a string does not have a valid interpretation as a floating-point value, value is set to zero and the return value is zero.
Версии этих функций с суффиксом _l идентичны версиям, у которых нет суффикса, за исключением того, что они используют переданный параметр языкового стандарта вместо языкового стандарта текущего потока.The versions of these functions that have the _l suffix are identical the versions that don’t have the suffix, except that they use the locale parameter that’s passed in instead of the current thread locale.
По умолчанию глобальное состояние этой функции ограничивается приложением.By default, this function’s global state is scoped to the application. Чтобы изменить это, см. раздел глобальное состояние в CRT.To change this, see Global state in the CRT.
RemarksRemarks
Эти функции преобразуют строку символов в значение двойной точности с плавающей запятой.These functions convert a character string to a double-precision, floating-point value.
Входная строка представляет собой последовательность символов, которые могут обрабатываться как числовое значение указанного типа.The input string is a sequence of characters that can be interpreted as a numerical value of the specified type. Каждая функция прекращает чтение строки на первом знаке, который она не может распознать как часть числа.The function stops reading the input string at the first character that it cannot recognize as part of a number. Этот символ может быть нуль-символом («\0″ или L»\0»), которым завершается строка.This character may be the null character (‘\0′ or L’\0’) terminating the string.
Аргумент str для атоф и _wtof имеет следующую форму:The str argument to atof and _wtof has the following form:
цифры] digits]
Пробелы состоят из пробелов или символов табуляции, которые игнорируются; знак «плюс» (+) или «минус» (-); цифры и являются одной или несколькими десятичными цифрами.A whitespace consists of space or tab characters, which are ignored; sign is either plus (+) or minus (-); and digits are one or more decimal digits. Если перед десятичной запятой никаких цифр нет, после нее должен отображаться хотя бы один символ.If no digits appear before the decimal point, at least one must appear after the decimal point. За десятичными цифрами может следовать показатель степени, состоящий из вводной буквы (eили e) и необязательного десятичного целого числа со знаком.The decimal digits may be followed by an exponent, which consists of an introductory letter (e, or E) and an optionally signed decimal integer.
UCRT версии этих функций не поддерживают преобразование букв экспоненты в стиле Fortran (d или d).The UCRT versions of these functions do not support conversion of Fortran-style (d or D) exponent letters. Это нестандартное расширение поддерживалось в более ранних версиях CRT и может оказаться критическим изменением для вашего кода.This non-standard extension was supported by earlier versions of the CRT, and may be a breaking change for your code.
Версии этих функций с суффиксом _l идентичны за исключением того, что они используют переданный параметр языкового стандарта вместо текущего языкового стандарта.The versions of these functions with the _l suffix are identical except that they use the locale parameter passed in instead of the current locale.
По умолчанию глобальное состояние этой функции ограничивается приложением.By default, this function’s global state is scoped to the application. Чтобы изменить это, см. раздел глобальное состояние в CRT.To change this, see Global state in the CRT.
Универсальное текстовое сопоставление функцийGeneric-Text Routine Mappings
| Подпрограмма TCHAR.HTCHAR.H routine | _UNICODE и _MBCS не определены_UNICODE & _MBCS not defined | _MBCS определено_MBCS defined | _UNICODE определено_UNICODE defined |
|---|---|---|---|
| _tstof_tstof | atofatof | atofatof | _wtof_wtof |
| _ttof_ttof | atofatof | atofatof | _wtof_wtof |
Example 3: atof Cases for INFINITY and NaN
When you run the program, the output will be:
INFINITY to Double = inf Inf to Double = inf Nan to Double = nan NAN to Double = nan
In general, a valid floating point argument for atof() function has the following form:
digits]
The atof() function ignores all the leading whitespace characters until the primary non-whitespace character is found.
Then, beginning from this character, it takes as many characters as possible that forms a valid floating-point representation and converts them to a floating point value. Whatever is left of the string after the last valid character is ignored and has no effect on the result.