Символьная информация и строки
Для символьных данных в 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); //перевод в нижний регистр