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

Используются в качестве операторов для преобразования символьной строки в число соответствующего типа (atoiцелого, atol длинного целого, atofвещественного двойной точности). Структура функции:

имя (string);

где имя – обозначение функции (atoi, atol, atof);

string – аргумент (строка, подлежащая преобразованию);

( ) – ограничители аргумента;

; – символ оператора.

Все функции располагаются в стандартной библиотеке stdlib.h. Функция atof продублирована в библиотеке math.h.

Внимание!

Использование функций требует предварительного под

ключения конкретной библиотеки (универсально –

stdlib.h):

#include <stdlib.h>

или

#include <math.h>

Аргумент string требует описателя до его использования:

char *string /* размер строки не определен*/

или

char string [10] /* размер зафиксирован

(10 символов)*/

Правила записи и использования

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

String – последовательность символов конкретного поля, заменяемых числовым значением определенного типа.

Функция atof предполагает использование строки со структурой стандартной записи числа с фиксированной (плавающей) точкой:

[ПС][знак][мантисса] [e|E [знак] степень]

где ПС – пустая строка (пробелы, знаки табуляции);

знак – обозначение "+" или "–";

мантисса – десятичные цифры с разделителем.

e (E) – обозначение основания системы счисления;

степень – показатель степени (целое число со знаком);

[ ] – признак необязательности содержимого.

5 Функции atoi и atol предполагают в качестве аргумента структуру стандартного целого числа (с учетом начальных пробелов):

[ПС][знак] число

где ПС – пустая строка (пробелы, знаки табуляции);

знак – обозначение "+" или "-";

число – последовательность цифр, образующих целочисленное значение.

Невозможность преобразования аргумента в значение данного типа подтверждается возвращаемым значением 0 (0L для atol).

Использование в качестве аргумента чисел, превышающих диапазон каждого типа, приводит к переполнению. Возвращаемое значение не определено.

Общий вид фрагмента программы ввода трех переменных:

#include <stdlib.h> /* директива препроцессора*/

float n1; /*описатель переменной n1 */

int n2; /*описатель переменной n2 */

long n3; /*описатель переменной n3 */

char buf[10]; /*описатель создаваемого массива buf */

PoleN1–>GetText(buf, 10); /*перемещение данного в buf*/

n1=atof(buf); /*преобразование в вещественный тип*/

PoleN2–>GetText(buf, 10); /*перемещение данного в buf*/

n2=atoi(buf); /*преобразование в целый тип*/

PoleN3–>GetText(buf, 10); /*перемещение данного в buf*/

n3=atol(buf); /*преобразование в длинный целый тип*/

Описатели типа переменных определяют переменную n1 как вещественную с обычной точностью, n2 – как целую, n3 – длинную целую, а buf как одномерный массив длиной 10 символов.

Восьмая, десятая и двенадцатая строки предписывают последовательное копирование содержимого полей ввода с именами PoleN1, PoleN2, PoleN3 в символьную строку buf, длиной 10 символов. Девятая, одиннадцатая, тринадцатая – последовательное преобразование символьной строки buf в формат вещественного числа n1, целого n2 и длинного целого n3.

Методика ввода переменных в диалоговые поля (при машинной обработке):

установить курсор в поле ввода (клавишей Tab или мышью);

ввести последовательность цифр и знаков числа;

проконтролировать правильность ввода, откорректировав при необходимости;

повторить ввод последующих переменных;

дать команду на выполнение (нажатием кнопки ОК).

Пример 6.6. Организовать ввод вещественных переменных а = 15.8, b = 0.365е-2, целой переменной i = -1.

Фрагмент программы имеет вид:

#include <stdlib.h> /* директива препроцессора*/

float а,b; /*описатель переменных а и b */

int i; /*описатель переменной i */

char buf[12]; /*описатель массива buf */

PoleA–>GetText(buf, 12);/*перемещение данного а в buf*/

a=atof(buf); /*преобразование в вещественный тип*/

PoleB–>GetText(buf, 12);/*перемещение данного b в buf*/

b=atof(buf); /*преобразование в вещественный тип*/

PoleI–>GetText(buf, 12); /*перемещение данного i в buf*/

i=atoi(buf); /*преобразование в целый тип*/

Размер буфера выбран с учетом возможных изменяемых значений вводимых переменных.

Пример 6.7. Организовать ввод вещественного массива А[4] с данными а1=2.1, а2=5.6, а3=7.5, а4=16.

Фрагмент программы имеет вид:

#include <stdlib.h> /* директива препроцессора*/

float а [4]; /*описатель переменных массива А */

int i; /* описатель переменной параметра цикла*/

char buf[10]; /*описатель массива buf */

for(i=0; i < 4; i++)

{

PoleA–>GetLine(buf, 10, i); /*перемещение а(i) в buf*/

a[i]=atof(buf);/*преобразование в вещественный тип*/

}

Внимание! Использование многострочного активного окна для ввода значений массивов требует предварительной установки его свойств Multiline (многострочное) и Want Return (возвращает значение) на этапе машинной обработки.

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

Используются в качестве операторов для преобразования числа соответствующего типа (itoaцелого, ltoa длинного целого, gcvtвещественного двойной точности) в символьную строку.

Функция gcvt

Используется в качестве оператора для преобразования вещественного числа двойной точности в символьную строку. Структура оператора:

gcvt(имя, размер, buffer);

где gcvt – обозначение функции;

имя – обозначение преобразуемого (выводимого) данного вещественного типа;

размер – количество выводимых значащих разрядов данного;

buffer – имя формируемой (выводимой) строки;

( ) – ограничители аргумента;

; – символ оператора.

Функция располагается в библиотеке stdlib.h.

Правила записи и использования

Функция применяется при выводе вещественных данных в поля графического интерфейса.

Имя преобразуемого данного – аналог обозначения выводимой переменной.

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

Переполнение буфера не контролируется.

Возникновение ошибок подтверждается отсутствием возвращаемого значения.

Функции itoa / ltoa

Используются в качестве операторов для преобразования целого /длинного целого числа в символьную строку.

Структура оператора:

ИФ (имя, buffer, ОСЧ);

где ИФ – имя функции (itoa, ltoa);

имя – обозначение преобразуемого (выводимого) данного целого/длинного целого типа;

buffer – имя формируемой (выводимой) строки;

ОСЧ – основание системы счисления выводимого данного;

( ) – ограничители аргумента;

; – символ оператора.

Функции располагаются в библиотеке stdlib.h.

Правила записи и использования

Функции применяются при выводе целочисленных данных в поля графического интерфейса.

Имя преобразуемого данного – аналог обозначения выводимой переменной.

Размер формируемого буфера определяет длину численного значения выводимой переменной с учетом символа окончания строки '\0', добавляемого автоматически.

Диапазон изменения основания системы счисления – целое число (2¸36).

Переполнение буфера не контролируется.

Возникновение ошибок подтверждается отсутствием возвращаемого значения.

Максимальная длина возвращаемой строки определяется используемой функцией (itoa – 17 байт, ltoa – 33 байта).

Общий вид фрагмента программы вывода трех переменных (целых, вещественных):

#include <stdlib.h> /* директива препроцессора*/

float n1; /*описатель переменной n1 */

int n2; /*описатель переменной n2 */

long n3; /*описатель переменной n3 */

char buf[12]; /*описатель массива buf */

gcvt(n1, 8, buf); /*преобразование числа n1 в строку buf*/

PoleN1–>SetText(buf); /*перемещение данного в PoleN1*/

itoa(n2, buf, 10);/*преобразование числа n2 в строку buf*/

PoleN2–>SetText(buf); /*перемещение данного в PoleN2*/

ltoa (n3, buf, 10);/*преобразование числа n3 в строку buf*/

PoleN3–>SetText(buf); /*перемещение данного в PoleN3*/

Описатели типа переменных определяют переменную n1 как вещественную с обычной точностью, n2 – как целую, n3 – длинную целую, а buf как одномерный массив длиной 12 символов.

Восьмая, десятая, двенадцатая строки предписывают преобразовать вещественную, целую и длинную целую переменные n1, n2, n3 в формат символьной строки buf. Максимальная длина символьной строки – 12 символов. Выводимое вещественное число должно содержать не более 8 значащих символов. Выводимые целые числа относятся к десятичной системе счисления. Девятая, одиннадцатая, тринадцатая – предписание скопировать содержимое символьной строки buf в поля вывода с именами PoleN1, PoleN2, PoleN3.

Функция sprintf

Используется в качестве оператора для форматного преобразования выводимого числа в символьную строку. Формат представления числа задается пользователем.

Структура оператора:

sprintf(buffer, “управляющая строка”, П1 [,П2, . . . ,Пn]);

где sprintf – имя функции (писать в строку);

buffer – имя формируемой (выводимой) строки;

“управляющая строка” – список спецификаторов выводимых переменных, оформленный в виде символьной строки;

П1 … Пn – список идентификаторов выводимых переменных;

, , – разделители идентификаторов (аргументов);

( ) – ограничители идентификаторов (аргументов);

[ ] – признак необязательности содержимого;

; – символ оператора.

Функция располагается в библиотеке stdio.h.

Правила записи и использования

Применяется при выводе числовых данных в поля графического интерфейса.

Имя преобразуемого данного – аналог обозначения выводимой переменной.

Структура каждой переменной определяется соответствующим спецификатором в управляющей строке.

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

Вывод (указание в списке) нескольких переменных допускается, но не рекомендуется (нарушается принцип одно поле – одна переменная).

Результат действия функции – подготовка содержимого буфера (buffer) к копированию в поле вывода.

Общий вид фрагмента программы вывода двух переменных (целой и вещественной):

#include <stdio.h>/* директива препроцессора*/

float n1; /*описатель переменной n1 */

int n2; /*описатель переменной n2 */

char buf[12]; /*описатель массива buf */

sprintf(buf,”%5.3f”, n1);/*преобразование числа n1 в buf*/

PoleN1–>SetText(buf);/*перемещение данного в PoleN1*/

sprintf(buf,”%10d”, n2);/*преобразование числа n1 в buf*/

PoleN2–>SetText(buf);/*перемещение данного в PoleN1*/

Седьмая и девятая строки предписывают преобразовать вещественную и целую переменные n1, n2 в символьную строку buf по форматам, указанным в управляющей строке. Восьмая и десятая – скопировать содержимое символьной строки buf в поля вывода с именами PoleN1, PoleN2.

Пример 6.8. Организовать вывод вещественных переменных а = 15.8, b = 0.365е-2, целой переменной i = -1.

Фрагмент программы имеет вид:

#include <stdlib.h> /* директивы*/

#include <stdio.h> /* препроцессора*/

float а,b; /*описатель переменных а и b */

int i; /*описатель переменной i */

char buf[12]; /*описатель массива buf */

sprintf(buf,”%5.3f”, а); /* преобразование числа в buf*/

PoleA–>SetText(buf); /*перемещение данного в PoleА*/

gcvt(b, 8, buf); /* преобразование числа в buf*/

PoleB–>SetText(buf); /*перемещение данного в PoleB*/

itoa(i, buf, 10); /* преобразование числа в buf*/

PoleI–>SetText(buf); /*перемещение данного в PoleI*/

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

Результаты вывода вещественных переменных а = 15.8, b = 0.365е-2, целой переменной i = -1 в активные поля имеют вид:

Количество разрядов в дробной части переменной «а» обусловлено заданным спецификатором (три знака после разделителя), в переменной «b» увеличено на 2 разряда (нулевых) в соответствии с правилом 3 использования функции gcvt.

Анализ переменной «b» определяет низкую эффективность ее представления (бесформатный вывод), подтверждая целесообразность форматного вывода вещественных переменных.

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

а) программа с классическим вводом/выводом:

# include <iostream.h>

#include <conio.h>

main()

{

float a,b,s;

cin >>a>>b;

s = a*b;

cout <<" a= "<<a<<" b= "<<b<<" s= "<<s;

getch();

}

б) фрагмент программы с использованием созданного ранее шаблона графического интерфейса (см. начало разд. 6.3) имеет вид:

#include<stdlib.h>

{

float a,b,s;

char buf[12];

PoleA–>GetText(buf,12); /* Скопировать содержимое окна ввода с именем PoleA в символьную строку buf */

a=atof(buf); /* Преобразовать символьную строку в вещественное число «а»*/

PoleB->GetText(buf,12); /* Скопировать содержимое окна ввода с именем PoleB в символьную строку «buf» */

b=atof(buf); /* Преобразовать символьную строку в вещественное число «b» */

s=a*b;

gcvt(s, 12, buf); /* Преобразовать число «s» в формат символьной строки*/

PoleS->SetText(buf); /*Отобразить результат в поле с именем PoleS*/

}