|
|||
Программирование. Лекция 5. Работа с символами и строками в С++Стр 1 из 3Следующая ⇒ Программирование. Лекция 5. Работа с символами и строками в С++ Из предыдущих лекций нам уже знаком символьный тип char. Описание символьных переменных имеет вид: char a, z; Для ввода и вывода символьных значений в форматных строках библиотечных функций printf() и scanf() используется спецификатор %c, например: char c; printf("Введите символ: "); scanf("%c",&c); printf("Вы ввели символ %с", c); Помимо scanf() и printf() для ввода и вывода символов в библиотеке предусмотрены специальные функции обмена: getch() – функция без параметров. Позволяет читать с клавиатуры по одному символу за обращение. Как и при использовании scanf(), чтение вводимых данных начинается после нажатия клавиши Enter. putchar(X) – выводит символьное значение X на экран. Пример (программа считает число значащих символов (не пробелов) в строке, которая заканчивается точкой): char c; int n; printf("Напишите предложение с точкой в конце:\n"); // сначала счетчик символов n равен нулю // цикл выполняется, пока считанный с клавиатуры символ не равен точке for (n = 0; (c = getch()) != '.'; ) { // выводим считанный символ на экран putch(c); // если символ не является пробелом, увеличиваем счетчик if (c!=' ') ++n; } printf("\nЧисло введенных символов (без пробелов): %d", n); Результаты работы программы: Напишите предложение с точкой в конце: 1 2 3 4 5 Число введенных символов (без пробелов): 5 Внутренние коды и упорядоченность символов. Данные типа char представлены численными значениями своих внутренних кодов. Благодаря этому возможно упорядочивание символов. Следующая программа выводит на экран десятичные коды символов от 0 до 9: char c; for (c='0'; c < '9'; c++) printf("Символ %c - %d\n", c, c); Результат работы программы: Символ 0 - 48 Символ 1 - 49 Символ 2 - 50 Символ 3 - 51 Символ 4 - 52 Символ 5 - 53 Символ 6 - 54 Символ 7 - 55 Символ 8 - 56 Таким же образом можно вывести на экран, например, коды символов от a до z (a будет иметь код 97, b – код 98, и т. д.). Упражнение. Написать программу для вывода латинского алфавита. Строковые константы В программе строки представляются последовательностью символов, заключенной в кавычки, например, "Это строка". Среди символов строки могут быть Esc-последовательности, соответствующие кодам неизображаемых символьных констант. Например, "Эта строка заканчивается переводом строки \n". При размещении строки в памяти в ее конец автоматически добавляется символ '\0', то есть нулевой байт. За счет этого длина строки увеличивается на один байт (например, символ 'A' занимает в памяти один байт, а строка "A" – два байта). В языке Си, в отличие от Паскаля, нет отдельного типа для строк. Строка считается массивом символов, то есть имеет тип char []. Количество элементов массива char будет на 1 больше, чем число символов в строке за счет добавления нулевого байта. Исторически символ занимает 1 байт, в этом случае он имеет тип char. При этом существуют и другие кодировки, в которых символ представляется, например, двумя байтами. Для работы с такими строками требуются специальные функции. Слегка отвлечемся от строк и разберем понятие кодировки. По определению, кодировка - это способ представления чего либо, в нашем случае символов. Кодировки символов делятся на однобайтные - каждый символ представлен одним байтом и многобайтные, в которых одному символу соответствует несколько байтов. В свою очередь многобайтные кодировки можно разделить на кодировки с фиксированным количеством байтов - каждому символу соответствует одинаковое количество байтов, и «плавающие», в которых один символ может представляться разным количеством байтов в зависимости от его содержимого. К первым относятся кодировки типа Unicode, в которой каждый символ представлен двумя байтами, ко вторым - UTF-8 и др. Присвоить значение массиву символов (строке) с помощью обычного оператора присваивания нельзя! Например, следующий фрагмент кода вызовет ошибку при компиляции: char str[10]; str = "New string"; Строку можно инициализировать: 1) при определении символьного массива, например (записываем в str строку string и посимвольно выводим ее на экран вместе с кодами символов): char str[10] = "String"; for (int i = 0; i < 10; i++) printf("%c - %d\n", str[i], str[i]); Результаты выполнения программы: S - 83 t - 116 r - 114 i - 105 n - 110 g - 103 - 0 - 0 - 0 - 0 В символьный массив размерности 10 может поместиться строка не длиннее 9 символов. Так, если мы захотим записать в str[10] строку "New string", мы получим ошибку компиляции, так как не останется места для записи завершающего нулевого байта. При инициализации символьного массива константной строкой можно не указывать размер массива, например: char str[] = "Это новая строка"; Если инициализация не производится, размер нужно задавать обязательно, то есть строка следующего вида приведет к ошибке компиляции: char str[]; 2) С помощью функций ввода-вывода printf(), scanf(), при этом используется спецификатор %s. char str[15]; printf ("Введите строку: "); scanf("%s",str); printf ("Вы ввели строку: %s ", str); Если при выполнении этой программы пользователь введет строку длиннее 14 символов (не забываем про нулевой байт), он получит ошибку времени исполнения программы. Есть еще один нюанс использования scanf() для чтения строк: эта функция читает строку до первого разделителя (пробела). То есть если в предыдущем примере пользователь введет строку "New string", в массив str запишется только часть строки до разделителя, то есть "New". Обратите внимание, что при считывании строк с помощью scanf() не используется оператор взятия адреса &. Это вызвано тем, что имя массива str уже является адресом его первого элемента. 3) с использованием функции копирования строкstrcpy(приемник, источник). Пример использования функции strcpy: char str1[10], str2[10]; strcpy(str1, "Hello"); strcpy(str2, str1); При использовании strcpy также нужно соблюдать осторожность, так как на этапе компиляции не контролируется достаточность памяти str1 и str2 для размещения строки. Существует функция strncpy (приемник, источник, число), которая позволяет задавать в последнем аргументе максимальное число копируемых символов. Следует заметить, что она не производит автоматическое добавление нулевого байта в конец строки. Пример использования: char str1[10]={0}, str2[10]={0}; strncpy(str1, "Hello world",9); strncpy(str2, str1,9); 4) с использованием функции gets(). Пример: char s[80]; gets(s);
|
|||
|