Символьные данные и строки
Цель лекции: изучить особенности внутреннего представления символьных данных и строк, научиться выполнять ввод/вывод, просмотр и замену в строках при решении задач на языке C++.
Для представления текстовой информации в языке С++ используются символы (константы), символьные переменные и строки (строковые константы), для которых в языке С++ не введено отдельного типа в отличие от некоторых других языков программирования.
Для символьных данных в С++ введен тип char. Описание символьных переменных:
char список_имен_переменных;
Например:
const char c='c'; //символ – занимает один байт, его значение не меняется char a,b; /*символьные переменные, занимают по одному байту, значения меняются*/ const char *s="Пример строки\n"; //текстовая константа
Строка – это последовательность символов, заключенная в двойные кавычки (" ").
Размещая строку в памяти, транслятор автоматически добавляет в ее конце символ '\0' (нулевой символ или нулевой байт, который является признаком конца строки). В записи строки может быть и один символ: "А" (заключен в двойные кавычки), однако, в отличие от символьной константы 'А' (используются апострофы), длина строки "А" равна 2 байтам.
В языке С++ строка – это пронумерованная последовательность символов (массив символов), она всегда имеет тип char[]. Все символы строки нумеруются, начиная с нуля. Символ конца строки также нумеруется – ему соответствует наибольший из номеров. Таким образом, строка считывается значением типа "массив символов". Количество элементов в таком массиве на 1 больше, чем изображение соответствующей строки, так как в конец строки добавлен нулевой символ '\0' ( рис. 7.1).
Символьная строка в программном коде может располагаться на нескольких строках. Для переноса используется символ '\' с последующим нажатием клавиши ввод. Символ '\' игнорируется компилятором, и следующая строка считается продолжением предыдущей.
Присвоить значение строке с помощью оператора присваивания нельзя, так как для массивов не определена операция прямого присваивания. Поместить строку в символьный массив можно либо при вводе, либо с помощью инициализации:
char s1[] = "ABCDEF"; //инициализация строки char s2[]={'A','B','C','D','E','F','\0'};//инициализация строки
Операция вычисления размера (в байтах) sizeof действует для объектов символьного типа и строк.
Пример 1.
// Определение размера строк #include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { char s1[10]="string1"; int k=sizeof(s1); cout<<s1<<"\t"<<k<<"\n"; char s2[]="string2"; k=sizeof(s2); cout<<s2<<"\t"<<k<<"\n"; char s3[]={'s','t','r','i','n','g','3','\0'}; /*окончание строки '\0' следует соблюдать, формируя в программах строки из отдельных символов*/ k=sizeof(s3); cout<<s3<<"\t"<<k<<"\n"; char *s4="string4"; //указатель на строку, ее нельзя изменить k=sizeof(s4); cout<<s4<<"\t"<<k<<"\n"; system("pause"); return 0; }
Результат выполнения программы:
string1 10 – выделено 10 байтов, в том числе под '\0'
string2 8 – выделено 8 байтов (7 + 1 байт под '\0' )
string3 8 – выделено 8 байтов (7 + 1 байт под '\0' )
Ввод-вывод символьных данных и строк
1) Ввод-вывод одиночного символа
getchar() – функция (без параметров) используется для ввода одиночного символа из входного потока. Она возвращает 1 байт информации (символ) в виде значения типа int. Это сделано для распознавания ситуации, когда при чтении будет достигнут конец файла.
putchar(ch) – функция используется для вывода одиночного символа, то есть помещает в стандартный выходной поток символ ch. Аргументом функции вывода может быть одиночный символ (включая знаки, представляемые управляющими последовательностями), переменная или функция, значением которой является одиночный символ.
Например:
/*Программа считывает из входного потока один символ, а затем выводит его на экран*/ #include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]){ char ch; ch=getchar(); putchar(ch); system("pause"); return 0; }
Пример 2. Введите предложение, в конце которого стоит точка, и подсчитайте общее количество символов, отличных от пробела (не считая точки).
#include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]){ char z; //z - вводимый символ int k; //k - количество значащих символов printf("Напишите предложение с точкой в конце:\n"); for (k=0; (z=getchar())!='.';) /*выражение z=getchar() заключено в скобки, так как операция присваивания имеет более низкий ранг, чем операция сравнения*/ if (z!=' ') k++; printf("\nКоличество символов=%d",k); system("pause"); return 0; }
Результат выполнения программы:
Напишите предложение с точкой в конце: 1 2 3 4 5 6 7 8 9 0. Количество символов=10
2) Ввод-вывод стандартного текстового (символьного) потока
gets(s) – функция, которая считывает строку s из стандартного потока до появления символа '\n', сам символ '\n' в строку не заносится.
puts(s) – функция, которая записывает строку в стандартный поток, добавляя в конец строки символ '\n', в случае удачного завершения возвращает значение больше или равное 0 и отрицательное значение ( EOF = -1 ) в случае ошибки.
Например:
#include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]){ char s[20]; gets(s); puts(s); system("pause"); return 0; }
Результат выполнения программы: при вводе строки "123 456 789" чтение данных осуществляется побайтно до символа '\n', то есть в s занесется строка "123 456 789\0" (управляющая последовательность '\0' на экран не выводится, а является признаком конца строки). При выводе строки функция puts возвращает в конце строки дополнительно один символ '\n', следовательно, будет выведена строка "123 456 789\n" (управляющая последовательность '\n' на экран не выводится, а осуществляет перевод курсора на новую строку).
Пример 3. Вычислите длину введенной строки.
#include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]){ char st[100]; int i=0; puts("Введите строку:"); gets(st); while(st[i++]); printf("Длина введенной строки = %i\n",i-1); system("pause"); return 0; }