Символьная информация и строки

Для символьных данных в C++ введен тип char.

Строка на языке C++ – это массив символов. Пример определения строки в программе:

 

int main()

{

char str[10];

return 0;

}

 

Строковым литералом называется последовательность символов, заключенная в двойные кавычки. В строковом литерале всегда на 1 символ больше, чем используется при записи; он всегда заканчивается нулевым символом ‘\0’.

Например:

sizeof(“Бор”) = 4;

 

Тип строкового литерала – массив константных символов. Таким образом, “Бор” принадлежит типу const char [4].

Строковый литерал можно присвоить переменной типа char*. Однако изменение строкового литерала через такой указатель является ошибкой:

void f()

{

char* p= “Платон”;

p[4] = ‘e’; //Ошибка: присваивание константе

}

 

Если нужна строка, которую можно модифицировать, следует скопировать символы в массив:

void f()

{

char p[]= “Зенон”; // p – массив из 6 символов

p[4] = ‘e’; // правильно

}

Пример. Задать строку (массив символов) и подсчитать количество вопросительных знаков в ней:

 

int main()

{

int i, nQuestCount=0;

char sInputLine[20];

cin >> sInputLine;

for(i = 0; i < strlen(sInputLine); i++)

if(sInputLine [i]=='?')

++ nQuestCount;

cout<< nQuestCount << '\n';

return 0;

}

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

int getchar(void) – осуществляет ввод одного символа их входного потока, при этом она возвращает один байт информации (символ) в виде значения типа int. Это сделано для распознавания ситуации, когда при чтении будет достигнут конец файла.

int putchar (int c) – помещает в стандартный выходной поток символ c.

char* gets(char*s) – считывает строку s из стандартного потока до появления символа ‘\n’, сам символ ‘\n’ в строку не заносится.

int puts(const char* s)записывает строку в стандартный поток, добавляя в конец строки символ ‘\n’, в случае удачного завершения возвращает значение больше или равное 0 и отрицательное значение (EOF=-1) в случае ошибки.

 

Пример 66

1. char s[20];

cin>>s; //ввод строки из стандартного потока

cout<<s; //вывод строки в стандартный поток

Результат работы программы:

При вводе строки “123 456 789”, чтение байтов осуществляется до первого пробела (при отсутствии пробела до конца строки), т.е. в строку s занесется только первое слово строки “123/0”, следовательно, выведется: 123.

 

2. char s[20];

gets(s); //ввод строки из стандартного потока

puts(s); //вывод строки в стандартный поток

Результат работы программы:

При вводе строки “123 456 789”, чтение байтов осуществляется до символа ‘\n’, т.е. в s занесется строка”123 456 789\n\0”, при выводе строки функция puts возвращает еще один символ ‘\n’, следовательно, будет выведена строка “123 456 789\n\n”.

3. char s[20];

scanf(“%s”,s);/*ввод строки из стандартного потока*/

printf(“%s”,s); /*вывод строки в стандартный поток*/

Результат работы программы:

При вводе строки “123 456 789”, чтение байтов осуществляется до первого пробела, т.е. в строку s занесется только первое слово строки “123/0”, следовательно, выведется: 123. Т.к. s – имя массива, т.е. адрес его первого элемента, операция & в функции scanf не используется.

4.Прочитать несколько строк текста можно так:

char str[100];

cin.getline(str, 100 , '*' );

Второй параметр этой функции (100) задаёт максимальную длину строки, третий (‘*’) – по какому символу прекратить ввод.

 

 

Функции работы с символьными строками (объявлены в заголовочном файле <string.h>):

 

char* strcpy(char* p, const char* q) //копирование из q в p

char* strcat(char* p, const char* q) //добавление q к p

size_t strlen(const char* p) //длина p (не считая конца строки)

int strcmp(const char* p, const char* q) //сравнение p и q; меньше (-1), равно (0), //больше(1)

char *strchr(const char *, int) // находит первое вхождение заданного //символа в строке

char *strncat(char *, const char *, size_t) // добавляет заданное число символов

//второй строки в конец первой

int strncmp(const char *, const char *, size_t) // сравнивает заданное число символов

//двух строк

char *strncpy(char *, const char *, size_t) // копирует заданное число символов

//второй строки в первую строку

char *strrchr(const char *, int) // находит последнее вхождение заданного

//символа в строке

char *strstr(const char *, const char *) // находит первое вхождение второй

//строки как подстроки первой

 

Из файла <ctype.h>:

int isdigit(int); // определяет, цифра или нет

int isalpha(int); //буква

int isupper(int); //буква в верхнем регистре

int islower(int); //буква в нижнем регистре

int isspace(int); //символ – разделитель

int ispunct(int); //символ пунктуации (ни один из вышеупомянутых)

int isalnum(int); //буква или цифра

int toupper(int); //перевод в верхний регистр

int tolower(int); //перевод в нижний регистр