Символьные данные и строки
3) Стандартные потоки ввода-вывода символьных данных и строк
cin – оператор, который определяет стандартные потоки ввода данных.
cout – оператор, который определяет стандартные потоки вывода данных.
<< – операция записи данных в поток;
>> – операция чтения данных из потока.
Например:
#include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]){ char s[20]; cin>>s; //ввод строки из стандартного потока cout<<s; //вывод строки в стандартный поток system("pause"); return 0; }
Результат выполнения программы: при вводе строки "123 456 789" чтение данных осуществляется побайтно до первого пробела, то есть в s занесется только первое слово строки "123\0", следовательно, выведется: "123".
Пример 4. Введите слово и замените в нем все вхождения заглавной латинской 'A' на малую латинскую 'a'. Выведите слово после редактирования.
#include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]){ char st[80]; int i; cout << "\nВведите слово: "; cin >> st; for(i=0;st[i]!='\0';i++) if (st[i]=='A') st[i]='a'; cout << "\nСлово после редактирования: "<< st; system("pause"); return 0; }
4) Форматированный ввод-вывод символьных данных и строк
printf() – функция, осуществляющая форматированный вывод данных.
scanf() – функция, осуществляющая форматированный ввод данных.
%c – спецификатор формата ввода-вывода одиночного символа.
%s – спецификатор формата ввода-вывода строки символов.
Например:
#include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]){ char s[20]; scanf("%s",s); //для строк не используется обращение по адресу & printf("%s",s); system("pause"); return 0; }
Результат выполнения программы: при вводе строки "123 456 789", чтение данных осуществляется побайтно до первого пробела, то есть в строку s занесется только первое слово строки "123\0", следовательно, выведется: "123". Так как s – имя символьного массива, то есть адрес его начального элемента, операция & в функции scanf для строк не используется.
Пример 5. Записать введенную строку символов в обратном порядке.
#include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]){ char st[80]; char temp; int i,len=0; printf("\nВведите строку > "); scanf("%s",st); while (st[len++]); //вычисление длины строки len-=2;//поправка на символ конца строки и нумерацию с нуля for(i=0;i<len;i++,len--){ temp=st[i]; //обмен символов st[i]=st[len]; st[len]=temp; } printf("\nПолученная строка > %s",st); system("pause"); return 0; }
Внутренние коды символов
В языке С++ принято соглашение, что везде, где синтаксис позволяет использовать целые числа, можно использовать и символы, то есть данные типа char, которые при этом представляются числовыми значениями своих внутренних кодов. Такое соглашение позволяет сравнительно просто упорядочивать символы, обращаясь с ними как с целочисленными величинами. Например, внутренние коды десятичных цифр в таблицах кодов ASCII упорядочены по числовым значениям, поэтому несложно перебрать символы десятичных цифр в нужном порядке.
//Печать десятичных цифр и их кодов #include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]){ char z; for (z='0'; z<='9'; z++) { if (z=='0' || z=='5') printf ("\n"); printf("%c - %x ",z,z); } system("pause"); return 0; }
Внутренние коды прописных и строчных символов латинского алфавита представлены соответственно последовательными величинами. Однако при использовании символов кириллицы необходимо учитывать, что между строчными символами 'п' и 'р' размещены символы псевдографики, которые прерывают следование кодов. Поэтому использование стандартных функций изменения регистра для символов кириллицы может привести к некорректному результату.
Пример 6. Вывести на экран вторую часть таблицы кодировки символов (символы с кодами от 128 до 255). Таблица должна состоять из восьми колонок и шестнадцати строк.
#include "stdafx.h" #include <iostream> using namespace std; #define SM 128 int _tmain(int argc, _TCHAR* argv[]){ unsigned char ch; /*если ch объявить как char, то буквам русского алфавита будут соответствовать отрицательные коды*/ int i,j; printf("Таблица ASCII кодировки символов\n"); for (i=0; i<16; i++) { // шестнадцать строк ch=i+SM; for (j=1; j<=8; j++) { // восемь колонок printf ("%4c -%4i",ch,ch); ch+=16; } printf ("\n"); } system("pause"); return 0; }
Ключевые термины
Внутренние коды символов – целые числа, однозначно соответствующие символам во внутреннем представлении.
Инициализация строки – определение значения строки.
Размер строки – объем памяти, занимаемой строкой, выраженный в байтах.
Символ конца строки – нулевой байт, являющийся признаком конца строки символов.
Символьная константа – константа типа char.
Символьная переменная – переменная типа char.
Строка – это пронумерованная последовательность символов, заключенная в двойные кавычки.
Краткие итоги
- Для представления текстовой информации в С++ используются символьные данные и строки.
- В С++ не определен строковый тип данных, и строка представляется как массив символов.
- Инициализировать строку можно как массив символов.
- Признаком конца строки является нулевой символ.
- Обратиться к элементу строки можно по индексу, который соответствует порядковому номеру элемента.
- Нумерация элементов строки начинается с нуля. Размер строки определяется количеством входящих в нее символов.
- В С++ предусмотрены различные способы ввода и вывода одиночных символов и строк: с помощью стандартных функций, с помощью потокового или форматированного ввода/вывода. При считывании строки с клавиатуры признак конца строки добавляется автоматически.
- Каждому символу однозначно соответствует его внутренний код.