Лекция 3 Строки
Символьные строки char s[80]; s[2] признак окончания строки: символ с кодом 0 s[3] 79 0 П р и в е т ! ¤ ¤ … ¤ ¤ ¤ рабочая часть s[0] s[1] ! Символ ' ' имеет код 0 символ '0' имеет код 48 Символьная строка – это последовательность символов, заключенная в двойные кавычки, которая заканчивается символом ' '. Строка символов хранится в памяти ЭВМ как массив символов. Значение символьной строки - это адрес ее первого символа. При трансляции программы компилятор разместит все символьные строки в памяти, а в программу вместо них подставит соответствующие адреса (т. е. значения символьных строк!).
Объявление символьных строк Объявить строку = выделить ей место в памяти и присвоить имя. выделяется 80 байт, в строке – char s[80]; «мусор» (если она глобальная, то нули ' ‘) char s 1[80] = "abc"; char qqq[] = "Вася"; ! выделяется 80 байт, занято 4 байта (с учетом ' ') выделяется 5 байт (с учетом ' ') • При выделении памяти надо учитывать место для символа ' '. • В строку нельзя записывать больше символов, чем выделено памяти. 4
Ввод и вывод символьных строк Задача: ввести слово с клавиатуры и заменить все буквы «а» на буквы «б» . %s – формат для ввода и вывода int main(){ символьных строк (выводится char q[80]; только часть до ' ' int i; начали с printf("Введите строкуn"); q[0] не надо ставить &: scanf( "%s", q); пока не дошли до &q[0] q i = 0; "%s" конца строки while ( q[i] != ' ' ) { if ( q[i] == 'а' ) q[i] = 'б'; i ++; переход к } следующему printf ( "Результат: %s ", q ); символу return 0; %s }
Ввод символьных строк Ввод одного слова: char q[80]; printf ("Введите текст: n"); scanf ( "%s", q ); printf ("Введено: n%s", q ); Введите текст: Вася пошел гулять Введено: Вася Ввод строки с пробелами: char q[80]; printf("Введите текст: n"); gets ( q ); printf("Введено: n%s", q ); Введите текст: Вася пошел гулять Введено: Вася пошел гулять 6
Вывод символьных строк Универсальный способ: printf ( "Результат: %s", q ); • можно выводить сразу и другую информацию: надписи, значения переменных, … Только для одной строки: puts ( q ); printf ( "%sn", q ); • вывод только одной строки • после вывода – переход на новую строку 7
Функции для работы со строками Подключение библиотеки: #include
Сравнение строк strcmp (string comparison): char q 1[80], q 2[80]; int n; gets ( q 1 ); gets ( q 2 ); n = strcmp ( q 1, q 2 ); ! Функция вычисляет разность между кодами первых двух отличающихся символов!
Пример решения задачи Задача: ввести строку и определить, сколько в ней слов. Программа должна работать только при вводе правильного пароля. Идея решения: • проверка пароля – через strcmp • количество слов = количеству первых букв слова • первая буква: пробел и за ним «не пробел» В а с я п о ш е л г у л я т ь ¤ ¤ ¤ • исключение: предложение начинается со слова (а не с пробела)
Проверка пароля #include
Основная часть программы #include
Копирование строк strcpy (string copy) char q 1[10] = "qwerty", q 2[10] = "01234"; strcpy ( q 1, q 2 ); куда откуда ! Старое значение q 1 стирается! копирование «хвоста» строки char q 1[10] = "qwerty", q 2[10] = "01234"; strcpy ( q 1, q 2+2 ); q 2 = &q 2[0] q 1 q w e t y ¤ ¤ ¤ 2 3 4 r q 2+2 = &q 2[2] q 2 0 1 2 3 4 ¤ ¤
Копирование строк копирование в середину строки char q 1[10] = "qwerty", q 2[10] = "01234"; strcpy ( q 1+2, q 2 ); q 1+2 = &q 1[2] q 1 q w 0 1 2 3 ¤ ¤ e r t y 4 ¤ q 2 0 1 2 3 4 ¤ ¤ char q 1[10] = "qwerty", q 2[10] = "01234"; strcpy ( q 1+2, q 2+3 ); q 1+2 = &q 1[2] q 1 q w 3 4 y ¤ ¤ ¤ e r t q 2+3 = &q 2[3] q 2 0 1 2 3 4 ¤ ¤
Копирование строк strncpy – копирование нескольких символов char q 1[10] = "qwerty", q 2[10] = "01234"; strncpy ( q 1+2, q 2, 2 ); q 1+2 = &q 1[2] q 1 q w 0 1 t y ¤ ¤ ¤ e r ! q 2 0 1 2 3 4 ¤ ¤ Функция strncpy не добавляет символ ' ' в конце строки!
Копирование строк копирование строки-константы char q 1[10] = "qwerty"; strcpy ( q 1+1, "ABCD"); q 1 q w B C D ¤ ¤ ¤ A e r t y A B C D char q 1[10] = "qwerty"; strcpy ( "ABCD", q 1+2 ); ! Первым параметром НЕ может быть константа!
Копирование строк копирование внутри одной строки char q[10] = "012345"; strcpy ( q, q+2 ); q 2 3 4 5 4 0 1 2 3 5 ¤ ¤ ¤ char q[10] = "012345"; strcpy ( q+2, q ); q 0 1 0 1 1 ¤ ¤ 2 3 4 5 0 ¤ Зацикливание! 17
Объединение строк strcat (string concatenation) = копирование второй строки в конец первой char q 1[10] = "qwe", q 2[10] = "0123"; strcat ( q 1, q 2 ); q 1 q w e 1 2 3 ¤ ¤ ¤ ¤ q 2 0 1 2 3 ¤ ¤ ¤ char q 1[10] = "qwe", q 2[10] = "0123"; strcat ( q 1, q 2+2 ); q 1 q w e 3 ¤ ¤ 2 ¤ ¤ q 2 0 1 2 3 ¤ ¤ ¤ 18
Проблемы при копировании строк • не хватает места для строки-результата char q 1[] = "qwer", q 2[10] = "01234"; strcpy ( q 1+2, q 2 ); q 1 q w 0 1 3 что-то другое q 2 0 1 2 3 ¤ ¤ ¤ e r 2 • зацикливание при копировании в ту же строку «слева направо» char q[10] = "01234"; strcpy ( q+2, q ); ! Транслятор не сообщает об этих ошибках! 19