Символьные данные и строки
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.
Строка – это пронумерованная последовательность символов, заключенная в двойные кавычки.
Краткие итоги
- Для представления текстовой информации в С++ используются символьные данные и строки.
- В С++ не определен строковый тип данных, и строка представляется как массив символов.
- Инициализировать строку можно как массив символов.
- Признаком конца строки является нулевой символ.
- Обратиться к элементу строки можно по индексу, который соответствует порядковому номеру элемента.
- Нумерация элементов строки начинается с нуля. Размер строки определяется количеством входящих в нее символов.
- В С++ предусмотрены различные способы ввода и вывода одиночных символов и строк: с помощью стандартных функций, с помощью потокового или форматированного ввода/вывода. При считывании строки с клавиатуры признак конца строки добавляется автоматически.
- Каждому символу однозначно соответствует его внутренний код.