Функции преобразования строк и числовых данных

 

unsigned long int strtol(const char *str, char **endptr, int base);

работает аналогично функции strtol, но преобразует символьное представление числа в число типа unsigned long int.

 

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

преобразует символьное представление числа в число типа double.

 

Все функции, перечисленные в этом параграфе, прекращают свою работу при встрече первого символа, который не подходит под формат рассматриваемого числа.

Кроме того, в случае если символьное значение числа превосходит диапазон допустимых значений для соответствующего типа данных, то функции atof, strtol, strtoul, strtod устанавливают значение переменной errno в ERANGE. Переменная errno и константа ERANGE определены в заголовочном файле math.h. При этом функции atof и strtod возвращают значение HUGE_VAL, функция strtol возвращает значение LONG_MAX или LONG_MIN, а функция strtoul – значение ULONG_MAX.

Для преобразования числовых данных в символьные строки могут использоваться нестандартные функции itoa, ltoa, utoa, ecvt, fcvt и gcvt. Но лучше для этих целей использовать стандартную функцию sprintf

 

int sprintf(char *buffer, const char *format, ...);

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

%[флаги][ширина][.точность][модификаторы]тип

где

‘флаги’ – это различные символы, уточняющие формат вывода;

‘ширина’ определяет минимальное количество символов, выводимых по данной спецификации;

‘точность’ определяет максимальное число выводимых символов;

‘модификаторы’ уточняют тип аргументов;

‘тип’ определяет тип аргумента.

Для вывода целых чисел со знаком используется следующий формат вывода:

%[-][+|пробел][ширина][l]d

где

- – выравнивание влево, по умолчанию – вправо;

+ – выводится знак ‘+’, заметим, что для отрицательных чисел всегда выводится знак ‘-‘;

‘пробел’ – в позиции знака выводится пробел;

l – модификатор типа данных long;

d – тип данных int.

 

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

%[-][#][ширина][l][u|o|x|X]

где

# – выводится начальный 0 для чисел в 8 c/c или начальные 0x или 0X для чисел в 16 c/c,

l – модификатор типа данных long;

u – целое число в 10c/c,

o – целое число в 8 c/c,

x, X – целое число в 16 c/c.

Для вывода чисел с плавающей точкой используется следующий формат вывода:

%[-] [+ | пробел][ширина][.точность] [f | e | E | g | G]

где

'точность' – обозначает число цифр после десятичной точки для форматов f, e и E или число значащих цифр для форматов g и G. Числа округляются отбрасыванием. По умолчанию принимается точность в шесть десятичных цифр;

f – число с фиксированной точкой,

e – число в экспоненциальной форме, экспонента обозначается буквой 'e',

E – число в экспоненциальной форме, экспонента обозначается буквой 'E',

g – наиболее короткий из форматов f или g,

G – наиболее короткий из форматов f или G.

 

15 Цели введения новых типов:

1. Ограничить множество значений существующего интервального типа.

2. Определить тип, который описывает данные, имеющие сложную структуру.

3. Придать более осмысленные названия существующим типам данных

 

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

Другие возможности для создания новых типов данных - объединения, перечисления, структуры.

Для переименования типов данных используется зарезервированное слово typedef.

Области видимости новых имен типов данных подчиняется правилам, что и имена переменных.

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

 

Другие возможности для создания новых типов данных - объединения, перечисления, структуры.

Для переименования типов данных используется зарезервированное слово typedef.

Области видимости новых имен типов данных подчиняется правилам, что и имена переменных.

 

Перечисления - тип данных, который включает множество именованных целочисленных констант.

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


Синтаксис:
enum имя_типа {список имен}

Для хранения перечислений используются целочисленные значения.

Без явного указания нумерация начинается с 0 и увеличивается на 1. Можно указать другое значение,если его записать после знака = последующие значения будут

увеличиваться начиная с этого индекса

enum color {red, green, blue};

cout<<red<<' '<<blue<<' '<<green; // "0 2 1"

 

В языке С тип enum эквивалентен типу int.

Это позволяет присваивать целочислен-ные значения непосредственно переменным типа перечисления.

В C++ ведется более строгий контроль за типами данных, и такие присваивания не допускаются.

color d=0; // ошибка

 

 

Структуройназывается упорядоченное множество данных. Данные входящие в структуру называются элементами (полями).

Тип каждого элемента может быть произвольным.

 

struct имя_типа_структуры

{
список элементов;

// описание шаблона структуры

}

 

Struct emp

{
int empno;

char value[10];

Double salary;

};
struct emp a;
// определение структуры в языке C

emp a; // определение структуры в языке C++

 

Инициализируются также как и массивы.

struct emp a={10,"Paul",200.15};


Так как элементы структуры описываются в блоке, то их имена принадлежат локальной области видимости (внутри этого блока).


Для доступа к элементу используется оператор (.).

a.empno=20;
strcpy(a.value,"John");
a.salaty=3000;
Для структур одного типа можно использовать оператор присваивания, который копирует поля структуры.

Struct emp b;

b=a;