Atof, atoi, atol преобразовать в плавающее


Атол () , atof () , ATOI () поведение функции , есть стабильный способ преобразования из / в строке / целое ?

В эти дни я играю с C функции atol(), atof() и atoi(), от блога, я найти учебник и прикладные:

Вот мои результаты:

atof() , которая возвращает значение типа float строки и atoi() , которая возвращает целое значение.

Теперь, чтобы увидеть разницу между 3-я проверил этот код:

Теперь, когда вы запустите программу, будут вывода (почему?, есть ли решение для преобразования чистые строки в целое?)

строка должна содержать числовые значения. Теперь измените программу так, как

вывод в этом случае (тестированы в Red Hat Linux) будет

поэтому функции взяли 007 только, не оставшаяся часть (почему?).

Теперь рассмотрим этот

вывод программы будет

Так что я просто хочу для преобразования строк в числа и затем снова один и тот же текст. Я играл с этими функциями, и, как вы видите, я получаю очень интересные результаты.

существуют ли какие-либо другие функции преобразования из/в строке/целое число и наоборот?

РЕДАКТИРОВАТЬ:

Так как вход, если я возьму некоторые имена, или что, я буду конвертировать их в целые числа/плавает. затем применить некоторые другие функции.

Также мне интересно знать, если я возьму то же, что и выход с той же входы, когда я использую любые ваши предложения?

Atof, atoi, atol преобразовать в плавающее

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):


_BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 600 || _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L;
или cc -std=c99

ОПИСАНИЕ

strtol(nptr, NULL, 10);

однако atoi() не определяет ошибки.

Функции atol() и atoll() ведут себя так же, как и atoi(), за исключением того факта, что начальная часть строки приводится к типу long или long long.

atoi, _atoi_l, _wtoi, _wtoi_l atoi, _atoi_l, _wtoi, _wtoi_l

Преобразуют строку в целое число. Convert a string to integer.

Синтаксис Syntax

Параметры Parameters

str str
Строка для преобразования. String to be converted.

locale locale
Используемый языковой стандарт. Locale to use.

Возвращаемое значение Return Value

Каждая функция возвращает значение int , полученное путем интерпретации входных символов в виде числа. Each function returns the int value produced by interpreting the input characters as a number. Возвращаемое значение равно 0 для atoi и _wtoi, если входные данные не могут быть преобразованы в значение этого типа. The return value is 0 for atoi and _wtoi, if the input cannot be converted to a value of that type.

В случае переполнения с большими отрицательными целочисленными значениями возвращается LONG_MIN . In the case of overflow with large negative integral values, LONG_MIN is returned. atoi и _Wtoi возвращают INT_MAX и INT_MIN в этих условиях. atoi and _wtoi return INT_MAX and INT_MIN on these conditions. Во всех случаях , когда выходит из диапазона, для параметра « ERANGE» задано значение «нет». In all out-of-range cases, errno is set to ERANGE. Если переданный параметр имеет значение NULL, вызывается обработчик недопустимых параметров, как описано в разделе Проверка параметров. If the parameter passed in is NULL, the invalid parameter handler is invoked, as described in Parameter Validation. Если выполнение может быть продолжено, эти функции устанавливают значение еинвал и возвращают 0. If execution is allowed to continue, these functions set errno to EINVAL and return 0.

Примечания Remarks

Эти функции преобразуют символьную строку в целочисленное значение (atoi и _wtoi). These functions convert a character string to an integer value (atoi and _wtoi). Входная строка представляет собой последовательность символов, которые могут обрабатываться как числовое значение указанного типа. 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 для atoi и _wtoi имеет следующую форму: The str argument to atoi and _wtoi has the following form:


Пробелы состоят из пробелов или символов табуляции, которые игнорируются; знак «плюс» (+) или «минус» (-); цифры и являются одной или несколькими цифрами. A whitespace consists of space or tab characters, which are ignored; sign is either plus (+) or minus (-); and digits are one or more digits.

Версии этих функций с суффиксом _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. Для получения дополнительной информации см. Locale. For more information, see Locale.

Сопоставления подпрограмм обработки обычного текста Generic-Text Routine Mappings

Подпрограмма TCHAR.H TCHAR.H routine _UNICODE и _MBCS не определены _UNICODE & _MBCS not defined _MBCS определено _MBCS defined _UNICODE определено _UNICODE defined
_tstoi _tstoi atoi atoi atoi atoi _wtoi _wtoi
_ttoi _ttoi atoi atoi atoi atoi _wtoi _wtoi

Требования Requirements

Подпрограммы Routines Обязательный заголовок Required header
atoi atoi
_atoi_l, _wtoi, _wtoi_l _atoi_l, _wtoi, _wtoi_l или or

Пример Example

Эта программа показывает, как числа, хранящиеся в виде строк, можно преобразовать в числовые значения с помощью функций atoi . This program shows how numbers stored as strings can be converted to numeric values using the atoi functions.

Atof, atoi, atol преобразовать в плавающее

atoi — Функция atoi (ASCII to integer, из ASCII в целое число) в языке программирования Си используется для приведения (конвертации) строки в числовой вид. int atoi(const char *str) Аргумент str означает строку, представленную в виде массива символов,… … Википедия

Atoi — The atoi (ASCII to Integer) function in the C programming language is used to convert a string into a numerical representation.:int atoi (const char *string) Where string is the string, represented by an array of characters. When atoi encounters… … Wikipedia

After Tax Operating Income — ATOI — A company s total operating income after taxes. This non GAAP measure excludes any after tax benefits or charges such as effects from accounting changes. Due to its non GAAP nature, what is included and excluded in the measure differs, therefore … Investment dictionary

Interpreter — Ein Interpreter (im Sinne der Softwaretechnik) ist ein Computerprogramm, das einen Programm Quellcode im Gegensatz zu Assemblern oder Compilern nicht in eine auf dem System direkt ausführbare Datei umwandelt, sondern den Quellcode einliest,… … Deutsch Wikipedia

Interpreter (Computer) — Ein Interpreter (im Sinne der Softwaretechnik) ist ein Computerprogramm, das einen Programm Quellcode im Gegensatz zu Assemblern oder Compilern nicht in eine auf dem System direkt ausführbare Datei umwandelt, sondern den Quellcode einliest,… … Deutsch Wikipedia

Interpretersprache — Ein Interpreter (im Sinne der Softwaretechnik) ist ein Computerprogramm, das einen Programm Quellcode im Gegensatz zu Assemblern oder Compilern nicht in eine auf dem System direkt ausführbare Datei umwandelt, sondern den Quellcode einliest,… … Deutsch Wikipedia

Comparison of programming languages (basic instructions) — Programming language comparisons General comparison Basic syntax Basic instructions Arrays Associative arrays String operations … Wikipedia

Luhn-Algorithmus — Der Luhn Algorithmus oder die Luhn Formel, auch bekannt als „Modulo 10“ oder „mod 10“ Algorithmus und als Double Add Double Methode, wurde in den 1960er Jahren von Hans Peter Luhn als eine Methode der Überprüfung von >Deutsch Wikipedia

Luhn-Formel — Der Luhn Algorithmus oder die Luhn Formel, auch bekannt als „Modulo 10“ oder „mod 10“ Algorithmus, wurde in den 1960er Jahren von Hans Peter Luhn als eine Methode der Überprüfung von >Deutsch Wikipedia


Atof, atoi, atol преобразовать в плавающее

Несколько способов преобразования строки в число и обратно.

Очень часто в форуме всплывает один и тот же вопрос — «Как преобразовать char*/char[]/CString/string в число?» или, несколько реже «Как преобразовать число в char*/char[]/CString/string». В этой небольшой статье я попытаюсь на него ответить максимально полным образом.

Преобразование строки в число

Выполнить преобразование строки в число можно многими способами — выбор конкретного зависит от ваших целей на момент написания кода. Есть штатные способы — ряд библиотечных функций, есть более изощренные, есть совсем уж извращенные годные разве что для экзерсисов в области программирования. Начну с самых простых.
Первый, и, наверное, самый распространенный, но далеко не самый лучший — использование штатных библиотечных функций atoi, atof, atol. Эти функции входит в стандартную библиотеку языка и присутствует в любом компиляторе. Их объявления выглядит так:

На вход они принимают указатель на строку, завершенную нулем, а возвращают — число, которое этой строкой описывается. atoi и atol воспринимают следующий формат числа:
[ пробелы][ знак] цифры
а atof, соответственно:
[ пробелы][ знак][ цифры][ . цифры][ < d| D | e | E >[ знак] цифры]
Здесь пробелы — любой из знаков пробела, табуляции (\t), вертикальной табуляции (\v) — они игнорируются. Знак — символ ‘+’ или ‘-‘. Если не указан, то считается, что число положительное. Цифры — символы от ‘0’ до ‘9’. Для числа с плавающей точкой, если не указаны цифры до знака ‘.’, то должна быть указана хотя бы одна цифра после него. После дробной части может быть указана экспонента, следующая за одним из символов-префиксов экспоненты.
Основной недостаток этих функций заключается в том, что они никак не сигнализируют об ошибке, если таковая произошла в процессе разбора переданной строки. Под ошибкой я понимаю невозможность корректно разобрать переданный набор символов — несоответствие его формату или по иным причинам.
Эту проблему решает следующий набор библиотечных функций, также включенных в стандартную библиотеку:

Эти функции имеют следующие отличия от предыдущей группы:

  • Через параметр end_ptr они возвращают указатель на первый символ, который не может быть интерпретирован как часть числа.
  • Контролируют переполнение и, если таковое произошло, сигнализируют об этом выставлением значения переменной errno в ERANGE, а также возвращают, соответственно, LONG_MAX/LONG_MIN, ULONG_MAX/ULONG_MIN и +/-HUGE_VAL в зависимости от знака числа в переданной строке.
  • strtod использует информацию о текущих установленных (через setlocale) региональных настройках, таким образом может корректно интерпретировать числа с символом ‘,’ в качестве разделителя целой и дробной части.
  • Для функций strtol и strtoul можно указать основание системы счисления. При этом, если в качестве основания передан 0, то основание определяется автоматически по первым символам числа. Если это символ ‘0’, а сразу за ним идет цифра — то основание принимается равным 8. Если первая цифра ‘0’, а за ней идет символ ‘x’ или ‘X’, то основание принимается равным 16. В остальных случаях основание принимается равным 10. В качестве цифр в этом случае можно использовать символы ‘0’ — ‘9’ и ‘A’ — ‘Z’ или ‘a’ — ‘z’, а основание может принимать значения от 2 до 36.
  • Если варианты этих функций для преобразования чисел, описанных unicode-строками. Они, соответственно, носят названия wcstol wcstoul и wcstod.

Типичное использование этих функций такое:

Как можно увидеть, используя эти функции можно получить гораздо больший контроль над преобразованием из строки в число. Для различных преобразований рекомендую пользоваться именно ими.
Говоря о стандартных библиотечных функциях нельзя не упомянуть такую функцию как scanf и ее разновидности — sscanf, fscanf и т. п:

и т. п.
Эту функцию имеет смысл использовать только в случае получения числа от пользователя с консоли (stdin) или из файла. Надо отметить, что функция весьма тяжеловесна (по объему линкуемого к исполняемому модулю библиотечного кода), и далеко не так быстра, как предыдущие, т. к. для преобразования необходимо разобрать форматную строку и соответствующим образом ее проинтерпретировать.
Аналогично можно использовать операторы потокового ввода (‘>>’). В случае написания программ на C++ этот вариант гораздо предпочтительней, чем использования метода scanf, т. к. обеспечивает гораздо больший контроль за типами на этапе компиляции. Ожидаемый формат числа можно указать с помощью флага формата:
dec — целое в десятичном формате;
hex — целое в шестнадцатеричном формате;
oct — целое в восьмеричном формате;
scientific — число с плавающей точкой в экспоненциальном формате;
fixed — число с плавающей точкой в фиксированном формате.
При этом форматы для целых чисел и чисел с плавающей точкой устанавливаются независимо друг от друга.
В случае получения результатов ввода пользователя из строки редактирования (EditBox, CEdit) имеет смысл пользоваться методом GetDlgItemInt:

UINT GetDlgItemInt(HWND hDlg, int item >pTranslated, BOOL signed)
UNIT CWnd::GetDlgItemInt( int item >pTranslated, BOOL signed)

Первым параметром в API-вызов передается хэндл диалогового окна, которому принадлежит строка редактирования. Параметр itemId задает идентификатор строки ввода, через pTranslated возвращается признак того, что введенная пользователем строка успешно проинтерпретирована как целое число. Параметром signed задается необходимость получения в качестве результата функции знакового числа.
Для преобразования экземпляра класса CString в число можно воспользоваться любым из предложенных выше методов, т. к. CString без труда преобразуется в указатель на null-terminated-строку. Специальных методов для этого класса разработчиками библиотеки не предусмотрено.
В VCL ситуация чуть лучше. Для класса AnsiString из этой библиотеки определены следующие методы, позволяющие получить число из его строкового представления:
ToInt — простое преобразование строки в целое число;
ToDouble — преобразует строку в число с плавающей точкой. Формат разделительных символов читается из региональных настроек системы.
Оба метода (в случае несоответствие строки формату числа) выбрасывают исключение. Также стоит обратить внимание на метод ToIntDef, который (в случае неудачного преобразования) возвращает значение по умолчанию, переданное ему в качестве параметра.
Вот основные библиотечные и API-функции, которые можно использовать для преобразования строки в число.

Преобразование числа в строку

К сожалению, стандартной специализированной функции (описанной в стандарте языка) для обратного преобразования (числа в строку) не существует. Но это не значит, что таких функций нет в RTL компиляторов. Для преобразования целого числа в строку можно воспользоваться следующими функциями:

эти функции входят в библиотеку компиляторов от Microsoft.
Для компиляторов фирмы Borland можно использовать следующие функции:

Как можно видеть — в компиляторах семейства Microsoft и Borland имена функций отличаются не сильно и формируются по следующему принципу:
[_] исходный_типto формат_строки. Исходные типы представлены следующими аббревиатурами:
i — int;
l — long;
ul — unsigned long;
i64 — int64;
ui64 — unsigned int 64;
формат строки, соответственно:
a — однобайтный char (ANSI);
w — wide-char (Unicode).
Параметры, принимаемые на вход, имеют следующий смысл. Первый параметр (value) — это значение, которое необходимо преобразовать в строку. Второй (string) — буфер, в который будет помещен результат преобразования. А третий (radix) — основание системы счисления, в которой будет представлено число.
Сказав выше, что нет стандартных функций преобразования числа в строку, я немного лукавил, так как имел в виду именно специализированные функции — аналоги atoi и strtol. К неспециализированным стандартным функциям, выполняющим необходимое преобразование, можно отнести функцию sprintf:

выполняющую форматированный вывод в заданный буфер, а также другие функции из этого семейства. Для необходимого нам преобразования необходимо воспользоваться форматной строкой «%d». При этом будет выполнено стандартное преобразование в десятичное представление числа, аналогичное предыдущим функциям. Формат полученного числа определяется тэгом типа. Существуют следующие тэги типов:
d (или i) — знаковое целое в десятичном формате;
u — беззнаковое целое в десятичном формате;
o — беззнаковое целое в восьмеричном формате;
x (или X) — беззнаковое целое в шестнадцатеричном формате.
Можно использовать также специальные спецификаторы тэгов типа (указываются непосредственно перед тэгом) для того, чтобы указать специальный формат, в котором передано число:
l — передано длинное целое (signed/unsigned long);
h — передано короткое целое (signed/unsigned short);
l64 (для Microsoft) или L (для Borland) — передано 64-битное целое (signed/unsigned __int64).
Вообще говоря, при использовании спецификатора типа h необходимо понимать, что при передаче в функцию printf переменных типа short (по стандарту) продвигаются до типа int. Таким образом, этот спецификатор просто дает указание функции форматирование игнорировать старшие разряды полученного целого параметра.
Функции форматного вывода хороши тем, что им можно явно указать формат, в котором мы хотим получить результат. В частности, форматная строка «%08x» преобразует переданное число в строку, содержащую шестнадцатеричное представление числа шириной 8 символов, при этом, при необходимости, строка будет дополнена слева незначащими нулями до 8 символов. Также достоинством этих функций (перед предыдущей группой) является то, что строка преобразуется в соответствии с установленными для программы (с помощью вызова функции setlocale) региональными настройками (locales).
К основным недостаткам методов форматного вывода можно отнести их низкую скорость работы (на порядок медленней их специализированных аналогов), невозможность преобразования в системы счисления, отличные от восьмеричной, десятичной, и шестнадцатеричной, а также отсутствия контроля за типами и размером переданного буфера, что может приводить к трудновыявляемым ошибкам.
Для перевода чисел с плавающей точкой предназначены следующие методы:


— для Microsoft-компиляторов и

для компиляторов от фирмы Borland.
Назначение функций следующее:
Функция ecvt конвертирует число (value) в заданное (count) количество символов, не выполняя при этом никакого форматирования. Через параметр dec возвращается позиция, с которой начинается дробная часть (позиция десятичной точки), начиная с первого символа строки, а через параметр sign — признак того, что число имеет знак. Тут необходимо сделать ряд следующих замечаний:

  1. Если строковое представление числа уже, чем необходимое количество символов, то число справа дополняется нулями.
  2. сли строковое представление числа шире, чем необходимое количество символов, то возвращаемая через dec позиция находится правее завершающего строку нуля или левее первого символа строки. Выбор знака dec зависит от знака десятичной экспоненты числа. Например, для value= 3.5678e20 и count=6 функция вернет строку «356780», а dec будет равно 21. А для значения 3.5678e-20 и 6, будет возвращено, соответственно, «356780» и -19.
  3. Преобразование производится во внутренний статический буфер, разделяемый с функцией fcvt, по этому необходимо быть осторожным при использовании функции в многопоточной среде.

Функция fcvt отличается от ecvt только тем, что параметр count задает не общее число символов, а число символов после десятичной точки (точность представление числа). При этом строковое представление (по необходимости) дополняется справа нулями до получения нужной ширины. Параметры dec и sign ведут себя аналогичным (как и для ecvt) образом. Для приведенных выше примеров возвращенные значения будут «356780000000000000000000000» и 21, а также «» и -19 соответственно. В последнем случае возвращенная пустая строка означает, что строковое представление содержит только нули.
Функция gcvt преобразует заданное число (value) в привычное строковое представление и помещает результат в переданный буфер (buffer). При этом в буфер будет помещено не более digits цифр. Если число может быть представлено таким количеством цифр, то оно будет преобразовано в десятичный (фиксированный) формат, иначе будет выполнено преобразование в экспоненциальный формат, и заданное количество цифр будет содержать мантисса числа. Полученное строковое представление может быть дополнено справа нулями для получения необходимого количества разрядов.
При использовании этой функции необходимо помнить следующее: буфер должен быть достаточно большим, чтобы принять digits цифр, завершающий ноль, а также знак, десятичную точку и экспоненту. Никакого контроля не производится, и граница буфера может быть нарушена. При формировании строки региональные настройки учитываются.
Для вывода чисел с плавающей точкой у функций семейства printf есть следующие тэги типов:
е (или Е) (exponent) — преобразует число в экспоненциальное представление;
f (fixed) — преобразует число в десятичное представление основываясь на дополнительных форматных параметрах (ширина и точность);
g (или G) (general) — преобразует число либо в экспоненциальное, либо в десятичное представление в зависимости от того, какое представление будет короче.
Так же, как и для целых чисел, можно указать дополнительные спецификаторы:
L — передано число в формате long double.
Необходимо заметить, что при передачи переменных типа float производится их продвижение до типа double.
Дополнительно можно указать общее количество значащих цифр в строковом представлении (ширну), а также количество цифр в дробной части (точность) в следующем виде:
% ширина>. точность> тэг_типа>.
Подробнее об этих форматах можно прочитать в документации по форматной строке функций этого семейства, т. к. подробное описание всех возможностей функций семейства printf выходит за рамки этой статьи.
В C++ числа можно конвертировать в символьное представление с помощью операторов потокового вывода ( dec — целое в десятичном формате;
hex — целое в шестнадцатеричном формате;
oct — целое в восьмеричном формате;
scientific — число с плавающей точкой в экспоненциальном формате;
fixed — число с плавающей точкой в фиксированном формате.
При этом форматы для целых чисел и чисел с плавающей точкой устанавливаются независимо.
При выводе региональные настройки также учитываются, но устанавливать их нужно особым образом, и обсуждение этого вопроса выходит за рамки этой статьи.
Если говорить о возможностях библиотек MFC и VCL, то в MFC единственный способ преобразовать число в строку — это метод Format класса CString. Этот метод работает аналогично методу sprintf.
У VCL в этом плане возможностей больше. У класса AnsiString существуют следующие статические методы:
IntToHex — преобразует число в шестнадцатеричное представление.
FormatFloat — преобразует число с плавающей точкой в строку в соответствии с заданной (в виде строки) маской, что позволяет получать числа практически в любом желаемом формате.
FloatToStrF — преобразует число в строку в соответствии с несколькими самыми распространенными форматами (sffGeneral, sffExponent, sffFixed), которые соответствуют форматам функции sprintf (g, e, f). Также этот метод может добавить в строку разделители тысяч (формат sffNumber), или преобразовать в представление денежных единиц (формат sffCurrency). При этом все разделительные символы, формат числа и т. п. будут взяты из текущих региональных настроек системы.
Также существуют (но не отражены в документации) нестатические методы класса AnsiString sprintf и printf, аналогичные по возможностям соответствующим RTL-ным, но не принимающие на вход буфер, в качестве которого используется экземпляр класса AnsiString.
В WinAPI (симметрично методу GetDlgItemInt) существует метод SetDlgItemInt, выполняющий необходимые преобразования числа в строку:

UINT SetDlgItemInt(HWND hDlg, int item >value, BOOL signed)
UNIT CWnd::GetDlgItemInt( int item >value, BOOL signed)

Последним параметров в эти функции передается признак знаковости числа.

Вот наверное и все, что можно сказать про штатные функции преобразования. В следующей части будут рассмотрены различные варианты «самописных» функций преобразования.

Функции gets, puts, atoi, atol и atof

Функции printf() и scanf() используют спецификации формата, указывающие формат и тип данных, которые должны быть напечатаны или введены. Если данные, введенные с помощью функции scanf(), не соответствуют строке формата, то функция может вести себя непредсказуемо. Иногда проще воспользоваться функцией gets(), которая читает вводимые символы (включая пробелы) в объявленную в программе строку символов (максимально возможное количество символов в ней задается в квадратных скобках, но не более 80). Если же должно быть введено число, то можно затем вызвать функцию atoi(), atol() или atof() для преобразования введенной строки соответственно в целое, длинное целое или вещественное число. Эти функции описаны в библиотеке stdlib.h, поэтому для их использования необходимо подключить эту библиотеку. Функция puts() выводит на экран строку символов.

Пример использования функций gets(), puts(), atoi().

Ввести имя и целое число как строки символов с помощью функции gets(), введенную строку с целым числом преобразовать в целое число с помощью функции atoi() и выдать на экран с помощью функции printf().

#include // В stdio.h описаны printf, gets

#include // В stdlib.h описана atoi

char name[40], // Строка символов для имени, состоящая из 40 символов, в введенной строке должно быть не более 39 символов, так как символ ’\0’ (конец строки) является обязательным

sage[40]; // Строка символов для возраста

int age=0; // Целое число для возраста

puts(“Пожалуйста, введите Ваше имя: “);

printf(“Привет, %s! Cколько Вам лет? ”, name);

age=atoi(sage); // Преобразование строки символов в целое число


printf(“Возраст %d, конечно, самый замечательный!”,age);

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Для студентов недели бывают четные, нечетные и зачетные. 9438 — | 7438 — или читать все.

188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

Atof, atoi, atol преобразовать в плавающее

496 просмотра

1 ответ

49 Репутация автора

У меня проблемы с функцией Atof. Я пытаюсь преобразовать строку в плавающее, но она не выдает никакой ошибки, когда я пытаюсь в программе Coocox в разделе отладки, вывод ничего не показывает. Я попробовал две функции Atoi и Atof. Когда я использую Atoi, нет вывода. Когда я использую Atof, программа запускает перезапуск. Здесь я поместил определение stdlib.h для atof. Но здесь значение atoff для значения с плавающей точкой. Я пробовал тот же код на Dev C ++ на C, он работает очень хорошо. Другие вещи, которые я использую, не работая Atof, но на этот раз программа перезапускается. Это работает на Dev C. Но не на Coocox. Как я могу решить проблему? Есть только разница в начале! С чем это может быть связано? Я использовал stdlib.h, и при компиляции ошибок нет!

Ответы (1)

1 плюс

12240 Репутация автора

после исправления всех предупреждений компилятора получился следующий код:

Примечание: поскольку функция массива не использовалась, я изменил ее на простой указатель. Это не имело никакого значения в выводе.

запуск программы привел к:

Так что, если ваш компилятор не находит, atof() это проблема с компилятором.


atof, atold

long double atold(const char *str)

Для совместимости со стандартом ANSI С надо использовать stdlib.h.

Функция atof() преобразует строку str в величину типа double. Строка должна содержать кор­ректное число с плавающей точкой. В случае ошибки возвращается 0, а переменная errno устанав­ливается равной ERANGE.

Число может заканчиваться любым символом, который не может являться частью числа с пла­вающей точкой. Например, этим символом может быть пробел, знак пунктуации, отличный от точки, буква, отличная от «Е» или «е». Это означает, что вызов atof() для строки «100.000HELLO» возвратит 100.00.

Функция atold() является версией функции atof(), возвращающей значение типа long double.

Функции преобразования типа

Функции преобразования данных довольно часто используются, как следует из названия, для преобразования одного типа данных в другой тип. В приведенной ниже табл. 8.3 перечислены основные функции, их прототипы подключаются в заголовочном файле stdlib. h.

Таблица 8.3. Преобразование данных

преобразует строку символов в число с плавающей точкой

преобразует строку символов в строку типа int

преобразует строку символов в число типа long

преобразует число с плавающей точкой типа double в строку символов; десятичная точка и знак числа не включаются в полученную строку; позиция точки и знак числа возвращаются отдельно

идентично ecvt, но округляет полученное значение до заданного числа цифр

преобразует число с плавающей точкой типа double в строку символов, включая символ десятичной точки и используя специфицированное число цифр

преобразует число типа int в строку

преобразует число типа long в строку символов


преобразует строку символов в число с плавающей точкой типа double

преобразует строку символов в число типа

преобразует строку символов в число типа

преобразует число типа unsigned long в строку символов

Чаще всего данные функции используются для преобразования чисел, введенных в виде символьных строк, в числовое представление, а также для выполнения определенных арифметических операций над ними и обратное преобразование в строку символов. Рассмотрим самые широко используемые из них.

Функция atoi (), синтаксис которой

int atoi(const char* ptr)

преобразует ASCII z-строку символов, на которую указывает ptr, в число типа int. Если в строке встречается символ, который не может быть преобразован, данная функция возвращает 0. В случае если преобразуемое число превышает диапазон представления типа int. возвращается только два младших байта числа.

В отличие от нее. функция atoi () преобразует заданное строковое число в тип long. Эта функция имеет аналогичный синтаксис:

int atoi(const char* ptr)

Если преобразуемое число превышает диапазон значений типа long, функция возвратит непредсказуемое значение.

Рассмотрим пример преобразования строки цифровых символов в целое и длинное целое.

long 1 = atol (str) ;

Если используется модель памяти, в которой тип int представляется двумя байтами, результат работы приведенной программы будет выглядеть следующим образом:

Дело в том, что число 70000 в шестнадцатеричной системе счисления представляется как 0x11170, но, поскольку функция atoi() при переполнении результата возвращает только два младших байта, переменная и примет шестнадцатернчное значение 0x1170, что эквивалентно десятичному 4464. Так как atol () оперирует с четырехбайтными числами, переполнения не произойдет и переменной 1 присвоится значение 70000.

Функция atof (), определенная как

double atof(const char* ptr)

выполняет преобразование ASCllz-строки в число с плавающей точкой типа double. Строка символов должна быть представлена с учетом формата:


[пробелы] [знак] [цифры] [. ] [цифры] [e|Е [знак] цифры] ,

[пробелы] — последовательность пробелов или табуляторов; [знак] -символ ‘ + ‘ или ‘-‘: [цифры] — десятичные цифры; [е | Е ] — символ показателя степени.

Преобразование символов прекращается, как только найден первый неконвертируемый символ или достигнут конец строки.

Функции обратного преобразования itoa() и ltoa() производят конвертирование чисел типа int и long соответственно. Они имеют следующий синтаксис:

char *_ltoa(long num, char* str, int radix);

char* itoa(int num, char* str, int radix);

char* _itoa(int num, char *str, int radix);

Данные функции принимают в качестве аргумента число num и преобразуют его в строку str с учетом основания системы счисления, представленной в переменной radix. Следующий фрагмент программы преобразует целое число 98765 в строку, используя десятеричную систему счисления:

int numb = 98765; char str[10];

itoa(numb, str, 10);

cout « numb « ‘\n’ « str;

Функция strtodO преобразует строку символов в число с плавающей точкой. Ее синтаксис имеет следующий вид:

double strtod(const char *s, char **endptr);

Эта функция так же, как и функция atof О, преобразует строку, на которую указывает s, в число типа double, с тем лишь отличием, что в случае прекращения конвертирования строки возвращает указатель на первый непреобразуемый символ. Это позволяет организовать в дальнейшем обработку оставшейся части строки.

Функция gcvt () имеет прототип:

char* gcvt(double val, int ndec, char *buf);

и осуществляет конвертирование числа val типа double в ASCI I z-строку, помещая ее в буфер buf. Если число цифр, подлежащих преобразованию, меньше целого числа, указанного в ndec, в преобразованном числе указываются символы знака и десятичной точки, при этом младшие разряды дробной части отбрасываются. В противном случае число преобразуется в экспоненциальную форму, функция возвращает указатель на начало сформированной строки.


Следующий ниже пример демонстрирует использование функции gcvt () для преобразования чисел, имеющих различное представление в массивы цифровых символов.

// Обычное представление числа num = 3.547;

gcvt(num, sig, str); cout « str « ‘ \n’ ;

// Отрицательное число num = -843.7105;

gcvt(num, sig, str); cout « str « ‘\n’;

// Экспоненциальное представление num = 0.135e4;

Atof, atoi, atol преобразовать в плавающее

496 просмотра

1 ответ

49 Репутация автора

У меня проблемы с функцией Atof. Я пытаюсь преобразовать строку в плавающее, но она не выдает никакой ошибки, когда я пытаюсь в программе Coocox в разделе отладки, вывод ничего не показывает. Я попробовал две функции Atoi и Atof. Когда я использую Atoi, нет вывода. Когда я использую Atof, программа запускает перезапуск. Здесь я поместил определение stdlib.h для atof. Но здесь значение atoff для значения с плавающей точкой. Я пробовал тот же код на Dev C ++ на C, он работает очень хорошо. Другие вещи, которые я использую, не работая Atof, но на этот раз программа перезапускается. Это работает на Dev C. Но не на Coocox. Как я могу решить проблему? Есть только разница в начале! С чем это может быть связано? Я использовал stdlib.h, и при компиляции ошибок нет!

Ответы (1)

1 плюс

12240 Репутация автора

после исправления всех предупреждений компилятора получился следующий код:

Примечание: поскольку функция массива не использовалась, я изменил ее на простой указатель. Это не имело никакого значения в выводе.

запуск программы привел к:

Так что, если ваш компилятор не находит, atof() это проблема с компилятором.

Илон Маск рекомендует:  Что такое код md5_file
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL