12_Strings.ppt
- Количество слайдов: 49
Строки Алтайский государственный университет Математический факультет Кафедра информатики Барнаул 2013
Организация курса 2
План Лекция 13 n n n Строки: общие сведения Функции для работы со строками Строки как параметры функций 3
Несколько заданий для самопроверки
Три задания для самопроверки Задание 1 n Что описывают следующие объявления? void *comp() ; void (*cmp)(); char (*(*x())[])(); comp – функция, возвращающая указатель на void cmp – указатель на функцию, возвращающую void x – функция, возвращающая указатель на массив из указателей на функции, возвращающие char 5
6 Три задания для самопроверки Задание 2 n Что выведет на экран следующая программа? #include
Три задания для самопроверки Задание 3 n Что выведет на экран следующая программа? #include
Строки: общие сведения n n n Массивы символов Символьные строки Объявление строк Указатели и строки Ввод и вывод строк
Строки: общие сведения Чем плох массив символов? Это массивы символов: char A[4] = { 'A', '3', '[', 'Ж'}; char B[10]; Для массива: • каждый символ – отдельный объект; • массив имеет длину N, которая задана при объявлении Что нужно: • обрабатывать последовательность символов как единое целое • строка должна иметь переменную длину 9
10 Строки: общие сведения Символьные строки char s[80]; признак окончания строки: символ с кодом 0 s[3] s[2] 79 0 П р и в е т ! ¤ ¤ … ¤ ¤ ¤ рабочая часть s[0] s[1] ! Символ ' ' имеет код 0 символ '0' имеет код 48 Символьная строка – это последовательность символов, которая заканчивается символом ' '.
11 Строки: общие сведения Объявление символьных строк Объявить строку = выделить ей место в памяти и присвоить имя. выделяется 80 байт, в char s[80]; строке – «мусор» (если она глобальная, то нули ' ‘) char s 1[80] = "abc"; char qqq[] = "Вася"; ! выделяется 80 байт, занято 4 байта (с учетом ' ') выделяется 5 байт (с учетом ' ') • При выделении памяти надо учитывать место для символа ' '. • В строку нельзя записывать больше символов, чем выделено памяти.
12 Строки: общие сведения Указатели и символьные строки char str[10] = "0123456"; char *p; /* указатель на символ */ p = str; /* или & str[0] */ *p = 'A'; /* "A 12345" */ p ++; /* перейти к str[1] */ *p = 'B'; /* "AB 2345“ */ p ++; /* перейти к str[2] */ strcpy ( p, "CD" ); /* "ABCD" */ strcat ( p, "qqq" ); /* "ABCDqqq" */ puts ( p );
Строки: общие сведения Ввод и вывод символьных строк Задача: ввести слово с клавиатуры и заменить все буквы «а» на буквы «б» . %s – формат для ввода и void main() вывода символьных строк { (выводится только часть до ' ' char q[80]; начали с int i; q[0] не надо ставить &: printf("Введите строкуn"); до &q[0] пока не дошли q scanf( "%s", q); "%s" конца строки i = 0; while ( q[i] != ' ' ) { if ( q[i] == 'а' ) q[i] = 'б'; переход к i ++; следующему } символу printf ( "Результат: %s ", q ); %s } 13
14 Строки: общие сведения Ввод символьных строк Ввод одного слова: char q[80]; printf ("Введите текст: n"); scanf ( "%s", q ); printf ("Введено: n%s", q ); Введите текст: Вася пошел гулять Введено: Вася Ввод строки с пробелами: char q[80]; printf("Введите текст: n"); gets ( q ); printf("Введено: n%s", q ); Введите текст: Вася пошел гулять Введено: Вася пошел гулять
15 Строки: общие сведения Вывод символьных строк Универсальный способ: printf ( "Результат: %s", q ); • можно выводить сразу и другую информацию: надписи, значения переменных, … Только для одной строки: puts ( q ); printf ( "%sn", q ); • вывод только одной строки • после вывода – переход на новую строку
Строки: общие сведения Упражнения 1. Ввести символьную строку и заменить все буквы "а" на буквы "б" и наоборот, как заглавные, так и строчные. Пример: Введите строку: ааббсс. ААББСС Результат: ббаасс. ББААСС 2. Ввести символьную строку и проверить, является ли она палиндромом (палиндром читается одинаково в обоих направлениях). Пример: Введите строку: АБВГДЕ КАЗАК Результат: Не палиндром. Палиндром. 16
Функции для работы со строками n n n Длина строки Сравнение строк Копирование строк Объединение строк Поиск в строке
Функции для работы со строками Подключение библиотеки: #include
19 Функции для работы со строками Сравнение строк (string comparison) int strcmp(const char *, const char *) char q 1[80], q 2[80]; int n; gets ( q 1 ); gets ( q 2 ); n = strcmp ( q 1, q 2 ); ! Функция вычисляет разность между кодами первых двух отличающихся символов! q 1 q 2 n "AA" 0 "AB" "AA" 1 "AA" "AB" – 1 "AA" "A" 65
20 Функции для работы со строками Пример решения задачи Задача: ввести строку и определить, сколько в ней слов. Программа должна работать только при вводе правильного пароля. Идея решения: • проверка пароля – через strcmp • количество слов = количеству первых букв слова • первая буква: пробел и за ним «не пробел» В а с я п о ш е л г у л я т ь ¤ ¤ ¤ • исключение: предложение начинается со слова (а не с пробела)
Функции для работы со строками Проверка пароля #include
Функции для работы со строками Основная часть программы #include
Функции для работы со строками Упражнения 1. Ввести предложение и определить, сколько слов заканчиваются на букву 'а'. Пример: Введите предложение: Мама мыла раму Декан пропил бутан Найдено слов: 2 Нет таких слов 2. Ввести предложение и разобрать его на отдельные слова: Пример: Введите предложение: Мама мыла раму Результат: Мама Подсказка: для вывода одного символа мыла используйте функцию putchar(символ). раму Например: putchar(q[i]); putchar('n'); // переход на новую строку 23
24 Функции для работы со строками Копирование строк (string copy) char *strcpy(char *to. Here, const char *from. Here); 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 2 3 4 r y ¤ ¤ ¤ q 2+2 = &q 2[2] q 2 0 1 2 3 4 ¤ ¤
25 Функции для работы со строками Копирование строк копирование в середину строки 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 ¤ ¤
26 Функции для работы со строками Копирование строк (копирование n символов) char *strncpy(char *to. Here, const char *from. Here, size_t n); 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 e r ! t y ¤ ¤ ¤ q 2 0 1 2 3 4 ¤ ¤ Функция strncpy не добавляет символ ' ' в конце строки!
27 Функции для работы со строками Копирование строк копирование строки-константы 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 ¤ Зацикливание и зависание компьютера! 28
29 Функции для работы со строками Объединение строк string concatenation = копирование второй строки в конец первой, сцепление строк char *strcat(char *dest, const char *src); 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 ¤ ¤ ¤
30 Функции для работы со строками Проблемы при копировании строк • не хватает места для строки-результата char q 1[] = "qwer", q 2[10] = "01234"; strcpy ( q 1+2, q 2 ); q 1 q w 0 1 3 что-то другое e r 2 q 2 0 1 2 3 ¤ ¤ ¤ • зацикливание при копировании в ту же строку «слева направо» char q[10] = "01234"; strcpy ( q+2, q ); ! Транслятор не сообщает об этих ошибках!
Функции для работы со строками Пример решения задачи Задача: ввести имя файла (без пути) и поменять его расширение на ". exe". Пример: Введите имя файла: vasya. html vasya Результат: vasya. exe Алгоритм: • найти точку в имени файла • если она есть, скопировать в это место строкуконстанту ". exe" • если точки нет, добавить в конец строки ". exe" 31
32 Функции для работы со строками Программа void main() { char f. Name[80]; int i; printf("Введите имя файлаn"); gets ( f. Name ); i = 0; while ( f. Name[i] != '. ' ) { if ( f. Name[i] == ' ' ) break; i ++; } if ( f. Name[i] == '. ' ) strcpy ( f. Name+i, ". exe" ); else strcat ( f. Name, ". exe" ); puts ( "Результат: " ); puts ( f. Name ); } поиск точки дошли до конца строки меняем или добавляем расширение
Функции для работы со строками Упражнения 1. Ввести полный адрес файла (возможно, без расширения) и изменить его расширение на «. exe» . Пример: Введите имя файла: C: DOC. TXTqqq. com Результат: C: DOC. TXTqqq. exe 2. Ввести в одной строке фамилию, имя и отчество. Вывести приветствие, где останутся имя и фамилия (см. пример). Пример: Введите ФИО: Пупкин Василий Иванович Результат: Привет, Василий Пупкин! 33
Функции для работы со строками Поиск в символьных строках Задача: найти заданный символ или сочетание символов (подстроку) в символьной строке. ! Функции поиска в Си возвращают адрес найденного символа или подстроки! Если образец не найден, возвращается NULL (нулевой адрес). Указатель – это переменная в которую можно записать адрес другой переменной заданного типа. 34
35 Функции для работы со строками Поиск символа (первого c начала строки) char *strchr(const char *, int) char q[10] = "abcd"; char *p; int nomer; q q+1 p q+5 p = strchr(q, 'b'); c d a b c d ¤ a b 0 1 2 3 4 5 6 7 8 9 if ( p == NULL ) printf ( "Не нашли. . . " ); else { nomer = p – q; printf ( "Номер символа %d", nomer ); } reverse strrchr: найти последний заданный символ в строке
36 Функции для работы со строками Поиск подстроки (первой с начала строки) char *strstr(const char *str, const char *substr); char q[10] = "abcd"; char *p; int nomer; q q+1 p q+5 p = strstr(q, "bcd"); d a b c d ¤ a b c 0 1 2 3 4 5 6 7 8 9 if ( p == NULL ) printf ( "Не нашли. . . " ); else { nomer = p – q; printf ( "Номер первого символа %d", nomer ); }
37 Функции для работы со строками Пример решения задачи Задача: ввести предложение и определить, сколько раз в нем встречается имя «Вася» . Проблема: функция strstr ищет только с начала строки. Алгоритм: 1. Записать адрес начала строки в указатель start. 2. Искать подстроку «Вася» , начиная с адреса start. p = strstr( start, "Вася"); 3. Если не нашли, выход из цикла. 4. Увеличить счетчик найденных слов. 5. Переставить start на адрес после найденного слова. 6. Перейти к шагу 2. start В а p с я и В а с я ! ! !
Функции для работы со строками Программа void main() адрес начало поиска { найденного char q[80], *start, *p; слова int count = 0; puts ( "Введите предложение" ); gets ( q ); start = q; /* ищем с начала строки */ while ( 1 ) { p = strstr ( start, "Вася" ); if ( p == NULL ) break; count ++; start = p + 4; /* отсюда ищем следующее слово */ } printf ( "Имя 'Вася' встречается %d раз", count ); } 38
Организация курса Функции преобразования строк в числа
Организация курса 40 Функции преобразования в(из) строку(и)
Функции для работы со строками Упражнения 1. Ввести предложение и заменить все имена «Вася» на «Юра» . Пример: Введите предложение: Вася, Вася и Вася!!! Результат: Юра, Юра и Юра!!! 2. Ввести предложение и заменить все имена «Юра» на «Вася» . Пример: Введите предложение: Юра, Юра и Юра!!! Результат: Вася, Вася и Вася!!! 41
Строки как параметры функций n n Передача параметров-строк Примеры функций со строковыми параметрами
43 Строки как параметры функций Символьные строки в функциях ! • строки передаются в функции так же, как и массивы; • функции могут изменять строки-параметры. Задача: составить процедуру, которая переставляет символы строки в обратном порядке. Алгоритм: • определить длину строки len; • все символы первой половины переставить с соответствующими символами второй половины: s[i] s[len-1 -i] c = s[i]; s[i] = s[len-i-1]; s[len-1 -i] = c;
44 Строки как параметры функций Программа void Reverse ( char s[] ) длину строки { определяем на месте int len = strlen(s); char c; for ( i = 0; i < len/2; i ++ ) { c = s[i]; s[i] = s[len-i-1]; Как сделать s[len-1 -i] = c; } инверсию любой } части строки? ? void main(){ char s[] = "1234567890"; Reverse ( s ); puts ( s ); Reverse ( s + 5 ); puts ( s ); } 0987654321 0987612345
Строки как параметры функций Упражнения 1. Разработать функцию, которая переставляет пары соседних символов. Пример: Введите предложение: Вася пошел гулять! Результат: а. Вясп шолег лутя!ь 2. Разработать функцию, которая удаляет все лишние пробелы (в начале предложения и сдвоенные пробелы). Пример: Введите предложение: Вася пошел гулять! Результат: Вася пошел гулять! 45
Строки как параметры функций Символьные строки в функциях Задача: составить функцию, которая находит количество цифр в строке. int Num. Digits ( char s[] ) { int i, count = 0; for ( i = 0; i < strlen(s); i ++ ) if( strchr ( "0123456789", s[i] ) ) count ++; return count; } if ( strchr ( "0123456789", s[i] ) != NULL ) или if ( '0' <= s[i] && s[i] <= '9' ) 46
Строки как параметры функций Символьные строки в функциях Основная программа int Num. Digits ( char s[] ) {. . . } void main() { char s[80]; int n; printf ( "Введите строкуn" ); gets ( s ); n = Num. Digits ( s ); printf ( "Нашли %d цифр. ", s ); } 47
Строки как параметры функций Упражнения 1. Разработать функцию, которая определяет, верно ли, что слово – палиндром. Пример: Введите слово: казак кунак Результат: Это палиндром. Не палиндром. 2. Разработать функцию, которая определяет, верно ли, что предложение (с пробелами) – палиндром. Пример: Введите предложение: а роза упала на лапу азора Результат: Это палиндром. 48
49 Вопросы и ответы Вопросы? n Строки: общие сведения ¨ ¨ ¨ n Функции для работы со строками ¨ ¨ ¨ n Массивы символов Символьные строки Объявление строк Указатели и строки Ввод и вывод строк Длина строки Сравнение строк Копирование строк Объединение строк Поиск в строке Строки как параметры функций ¨ ¨ Передача параметров-строк Примеры функций со строковыми параметрами Дубовая роща. Девочка и апельсин


