Функции преобразования строк и числовых данных
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;