Чтение из строки/запись в строку




Ввод/вывод в С

Функции ввода/вывода определены в заголовочном файле <stdio.h>

Вывод осуществляется функцией printf, которая имеет следующий синтаксис:

printf (<строка описания форматов> [, <список вывода> ]);

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

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

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

Ввод осуществляется функцией scanf, которая имеет следующий синтаксис:

scanf (<строка описания форматов> [, <список ввода> ]);

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

К управляющим последовательностям относятся следующие последовательности символов.

Последовательность Дейcтвие
\a Звуковой сигнал
\b Удаление предыдущего символа
\n Новая строка
\r Возврат каретки
\t Табуляция
\' Апостроф
\" Кавычки
\\ Обратный слеш
\ ooo ASCII символ в восьмеричной нотации
\x ooo ASCII символ в шестнадцатеричной нотации

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

%[ флаги ] [ ширина ] [ .точность ] [ {h | l | L | I64} ] тип

Флаги Значение По умолчанию
Выравнивание по левому краю. Выравнивание по правому краю.
+ Добавление знака + или – перед числами. Знак добавляется только перед отрицательными числами.
  Добавление нулей перед выводимым значением. Если одновременно используются флаги – и 0, 0 игнорируется. Добавление пробелов.
пробел Добавление пробела перед положительным числом. Если одновременно используются флаги пробел и +, пробел игнорируется. Пробел не добавляется.
# Добавление символов 0, 0х или 0Х перед ненулевым значением, если флаг # используется с форматами о, х или Х соответственно. Символы 0, 0х и 0Х не добавляются.
При использовании с форматами e, E и f флага # выводимое число будет содержать десятичную точку в любом случае. Десятичная точка добавляется, только если за ней следуют цифры.
При использовании с форматами g и G флага # выводимое число будет содержать десятичную точку и хвостовые нули в любом случае. Десятичная точка добавляется, только если за ней следуют цифры. Хвостовые нули не выводятся.
Игнорируется при использовании с форматами c, d, i, u и s.  

Поле ширина содержит минимальное количество выводимых символов – неотрицательное целое число. Если выводимое значение содержит меньше символов, то оно расширяется пробелами (если не задан флаг 0). Если поле ширина содержит звездочку (*), то в качестве значения поля берётся целое число из списка аргументов, предшествующее выводимому значению.

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

Тип Действие По умолчанию
c, C Точность не имеет эффекта. Выводится символ.
d, i, u, o, x, X Точность задаёт минимальное количество символов, которые будут напечатаны. Если число содержит меньше символов, оно расширяется нулями. Точность равна 1.
e, E, f Точность задаёт количество символов после десятичной точки. Число округляется. Точность равна 6. Если точность равна 0 или опущена, десятичная точка не выводится.
g, G Точность задаёт максимальное количество значащих цифр. Печатается 6 значащих цифр.
s, S Точность задаёт максимальное количество выводимых символов. Выводятся все символы строки.

 

Если поле точность содержит звездочку (*), то в качестве значения поля берётся целое число из списка аргументов, предшествующее выводимому значению.

Дополнительные префиксы h, l, L и I64 задают «размер» аргумента – long или short, однобайтовый символ или расширенный символ, в зависимости от спецификации типа, которую они модифицируют.

Обязательное поле тип задаёт тип выводимого значения.

Символ Тип Формат вывода
c int или wint_t При использовании с функцией printf определяет однобайтовый символ, при использовании с функцией wprintf определяет расширенный символ.
C int или wint_t При использовании с функцией printf определяет расширенный символ, при использовании с функцией wprintf определяет однобайтовый символ.
d int Знаковое десятичное целое.
i int Знаковое десятичное целое.
o int Беззнаковое восьмеричное целое.
u int Беззнаковое десятичное целое.
x int Беззнаковое шестнадцатеричное целое с использованием символов «abcdef».
X int Беззнаковое шестнадцатеричное целое с использованием символов «ABCDEF».
e double Знаковое число в форме [ – ]d.dddd e [знак]ddd, где d есть одна десятичная цифра, dddd – одна или более десятичных цифр, ddd – три десятичные цифры and знак есть + или –.
E double Идентичен формату e, за исключением того, что символ E, а не e вводит экспоненту.
f double Знаковое число в форме [ – ]dddd.dddd, где dddd есть одна или более десятичных цифр. Количество цифр перед десятичной точкой зависит от величины числа, а количество цифр после десятичной точки – от требуемой точности.
g double Знаковое число в формате f или e, в зависимости от того, какой формат более компактен для заданного значения и точности.
G double Идентичен формату g, за исключением того, что символ E, а не e вводит экспоненту.
n pointer tointeger Количество символов успешно записанных к данному моменту в выходной поток. Это значение сохраняется в целочисленной переменной, чей адрес задан как аргумент.
p pointer tovoid Печатает адрес, заданный аргументом.
s string При использовании с функцией printf задаёт строку однобайтовых символов, при использовании с функцией wprintf задаёт строку расширенных символов. Символы печатаются до достижения признака конца строки.
S string При использовании с функцией printfзадаёт строку расширенных символов, при использовании с функцией wprintf задаёт строку однобайтовых символов. Символы печатаются до достижения признака конца строки.

 

int m, n, x;

double y;

char c = '&';

char str[] = "String";

scanf("%d%d", &m, &n); // Ввод десятичных целых чисел в переменные m и n

printf("m = %5d\nn = %5d\n", m, n); // Вывод переменных m и n в десятичном целом формате, используются как минимум 5 знаков

scanf("%d", &x); // Ввод десятичного целого числа в переменную x

printf("%#010x\n", x); // Вывод переменной x в шестнадцатеричной системе, используются 10 знаков, впереди добавляются нули и символы

scanf("%lf", &y); // Ввод вещественного числа в переменную y

printf("y = %7.2lf\n", y); // Вывод вещественной переменной, используются как минимум 7 знаков, из них 2 – после точки

printf("c = %c\n", c); // Вывод одного символа

printf("%.4s\n", str); // Вывод строки (не более 4 символов)


Чтение из строки/запись в строку

A. Функции sprintf и sscanf позволяют произвести запись значений переменных в форматированную строку или чтение переменных из строки:

int sscanf (char * str , char * format ,...);

int sprintf (char * str , char * format ,...);

Эти функции во всём аналогичны функциям printf и scanf, только в качестве первого параметра указывается строка, куда записываются или откуда считываются данные.

B. Функции gets и puts

gets () Читает строку с клавиатуры

puts () Выводит строку на экран

 

Потоковый ввод/вывод

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

Поток — это некоторая абстракция, отражающая перемещение данных от источника к приемнику.

Использование стандартных потоков cin и cout

Для того чтобы использовать стандартные потоки для ввода и вывода, необходимо включить заголовочный файл <iostream>.

Для ввода используется операция >>, для вывода – операция <<. Компилятор определяет тип вводимой/выводимой переменной и соответствующим образом форматирует её.

#include <iostream>

using namespace std;

cin >> x; // Ввод значения в переменную x из стандартного потока cin

cout << x; // Вывод значения переменной x в стандартный поток cout

cin >> x >> y; // Ввод двух переменных

cout << "x = " << x << "\ny = " << y << endl; // Функция endl осуществляет перевод строки

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

cin >> x;

if (cin.fail())

cout << "Произошла ошибка при вводе\n";

Форматирование

Для управления форматом вводимого/выводимого значения используются так называемые манипуляторы. Это функции, которые вставляются между вводимыми/выводимыми значениями и изменяют состояние потока.

Для использования манипуляторов необходимо включить заголовочный файл <iomanip>.

Манипулятор — объект особого типа, который управляет потоками ввода/вывода, для форматирования передаваемой в потоки информации.

Таблица 1 Манипуляторы форматирования в С++

Манипулятор Назначение Пример Результат
endl Переход на новую строку при выводе cout << «website:» << endl << «cppstudio.com»; website: cppstudio.com
boolalpha Вывод логических величин в текстовом виде (true, false) bool log_false = 0, log_true = 1; cout << boolalpha <<log_false << endl << log_true << endl; false true
noboolalpha Вывод логических величин в числовом виде (true, false) bool log_true = true; cout << noboolalpha << log_true << endl;  
oct Ввод/вывод величин в восьмеричной системе счисления int value; cin >> value; cout <<oct<< value << endl; ввод:9910 вывод:1438
dec Ввод/вывод величин в десятичной системе счисления (флаг установлен по умолчанию) int value = 148; cout << dec<< value << endl;  
hex Ввод/вывод величин в шестнадцатеричной системе счисления int value; cin >> value; cout <<hex<< value << endl; ввод:9910 вывод:6316
showbase Выводить индикатор основания системы счисления. Указывает, что основание числа должно выводиться перед числом: для восьмеричных чисел выводится начальный символ "0", десятичные числа выводятся обычным способом, шестнадцатеричные числа выводятся с индикатором "0x" или "0X". int value; cin >> value; cout <<oct << showbase<<value << endl; ввод:9910 вывод:01438
noshowbase Не выводить индикатор основания системы счисления (по умолчанию). int value = 64; cout << noshowbase << hex << value << endl;  
uppercase В шестнадцатеричной системе счисления использовать буквы верхнего регистра(по умолчанию установлены буквы нижнего регистра) int value; cin >> value; cout << hex<< uppercase << value << endl; ввод:25510 вывод:FF16
nouppercase В шестнадцатеричной системе счисления использовать буквы нижнего регистра (по умолчанию). int value = 255; cout << nouppercase << hex << value << endl; ff16
scientific Вывод чисел с плавающей точкой в экспоненциальной форме double value = 1024.165; cout << scientific << value << endl; 1.024165e+003
showpos Вывод знака плюс + для положительных чисел int value = 15; cout << showpos << value << endl; +15
noshowpos Не выводить знак плюс + для положительных чисел (по умолчанию). int value = 255; cout <<noshowpos<< value << endl;  
fixed Вывод чисел с плавающей точкой в фиксированной форме (по умолчанию) double value = 1024.165; cout << value << endl; 1024.165
setw(int number) Установить ширину поля, где number — количество позиций, символов (выравнивание по умолчанию по правой границе). Манипулятор с параметром. cout << setw(40) << «cppstudio.com» << endl; __cppstudio.com
right Выравнивание по правой границе(по умолчанию). Сначала необходимо установить ширину поля(ширина поля больше чем, длина выводимой строки). cout << setw(40)<< right <<"cppstudio.com" << endl; __cppstudio.com
left Выравнивание по левой границе. Сначала необходимо установить ширину поля (ширина поля больше чем, длина выводимой строки). cout << setw(40)<<left<<"cppstudio.com" << endl; cppstudio.com__
Internal Показывает, что знак числа должен быть выровнен по левой границе поля, а значение числа – по правой границе. В промежуточные позиции размещаются заполняющие символы. int x=-254; cout << setw(10)<<internal<< x << endl; - 254
setprecision(int count) Задаёт количество знаков после запятой, где count — количество знаков после десятичной точки cout << fixed << setprecision(3) << (13.5 / 2) << endl; 6.750
setfill(int symbol) Установить символ заполнитель. Если ширина поля больше, чем выводимая величина, то свободные места поля будут наполняться символом symbol— символ заполнитель cout << setfill(‘0′) << setw(4) << 15 << ends << endl;  

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2021-02-02 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: