Скачать презентацию Строки Алтайский государственный университет Математический факультет Кафедра информатики Скачать презентацию Строки Алтайский государственный университет Математический факультет Кафедра информатики

12_Strings.ppt

  • Количество слайдов: 49

Строки Алтайский государственный университет Математический факультет Кафедра информатики Барнаул 2013 Строки Алтайский государственный университет Математический факультет Кафедра информатики Барнаул 2013

Организация курса 2 Организация курса 2

План Лекция 13 n n n Строки: общие сведения Функции для работы со строками План Лекция 13 n n n Строки: общие сведения Функции для работы со строками Строки как параметры функций 3

Несколько заданий для самопроверки Несколько заданий для самопроверки

Три задания для самопроверки Задание 1 n Что описывают следующие объявления? void *comp() ; Три задания для самопроверки Задание 1 n Что описывают следующие объявления? void *comp() ; void (*cmp)(); char (*(*x())[])(); comp – функция, возвращающая указатель на void cmp – указатель на функцию, возвращающую void x – функция, возвращающая указатель на массив из указателей на функции, возвращающие char 5

6 Три задания для самопроверки Задание 2 n Что выведет на экран следующая программа? 6 Три задания для самопроверки Задание 2 n Что выведет на экран следующая программа? #include void main() { int const * p=5; printf("%d", ++(*p)); } При компиляции возникнет ошибка: попытка изменить константное значение по указателю

Три задания для самопроверки Задание 3 n Что выведет на экран следующая программа? #include Три задания для самопроверки Задание 3 n Что выведет на экран следующая программа? #include void main() { int A[]={2, 5, 7, 3, 4}, *p=A+3; printf("%d%d", p[-2], -1[p]); } 57 7

Строки: общие сведения n n n Массивы символов Символьные строки Объявление строк Указатели и Строки: общие сведения n n n Массивы символов Символьные строки Объявление строк Указатели и строки Ввод и вывод строк

Строки: общие сведения Чем плох массив символов? Это массивы символов: char A[4] = { Строки: общие сведения Чем плох массив символов? Это массивы символов: char A[4] = { 'A', '3', '[', 'Ж'}; char B[10]; Для массива: • каждый символ – отдельный объект; • массив имеет длину N, которая задана при объявлении Что нужно: • обрабатывать последовательность символов как единое целое • строка должна иметь переменную длину 9

10 Строки: общие сведения Символьные строки char s[80]; признак окончания строки: символ с кодом 10 Строки: общие сведения Символьные строки char s[80]; признак окончания строки: символ с кодом 0 s[3] s[2] 79 0 П р и в е т ! ¤ ¤ … ¤ ¤ ¤ рабочая часть s[0] s[1] ! Символ '' имеет код 0 символ '0' имеет код 48 Символьная строка – это последовательность символов, которая заканчивается символом ''.

11 Строки: общие сведения Объявление символьных строк Объявить строку = выделить ей место в 11 Строки: общие сведения Объявление символьных строк Объявить строку = выделить ей место в памяти и присвоить имя. выделяется 80 байт, в char s[80]; строке – «мусор» (если она глобальная, то нули '‘) char s 1[80] = "abc"; char qqq[] = "Вася"; ! выделяется 80 байт, занято 4 байта (с учетом '') выделяется 5 байт (с учетом '') • При выделении памяти надо учитывать место для символа ''. • В строку нельзя записывать больше символов, чем выделено памяти.

12 Строки: общие сведения Указатели и символьные строки char str[10] = 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 ( 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 ( 15 Строки: общие сведения Вывод символьных строк Универсальный способ: printf ( "Результат: %s", q ); • можно выводить сразу и другую информацию: надписи, значения переменных, … Только для одной строки: puts ( q ); printf ( "%sn", q ); • вывод только одной строки • после вывода – переход на новую строку

Строки: общие сведения Упражнения 1. Ввести символьную строку и заменить все буквы Строки: общие сведения Упражнения 1. Ввести символьную строку и заменить все буквы "а" на буквы "б" и наоборот, как заглавные, так и строчные. Пример: Введите строку: ааббсс. ААББСС Результат: ббаасс. ББААСС 2. Ввести символьную строку и проверить, является ли она палиндромом (палиндром читается одинаково в обоих направлениях). Пример: Введите строку: АБВГДЕ КАЗАК Результат: Не палиндром. Палиндром. 16

Функции для работы со строками n n n Длина строки Сравнение строк Копирование строк Функции для работы со строками n n n Длина строки Сравнение строк Копирование строк Объединение строк Поиск в строке

Функции для работы со строками Подключение библиотеки: #include <string. h> Длина строки: (string length) Функции для работы со строками Подключение библиотеки: #include Длина строки: (string length) size_t strlen(const char *) char q[80] = "qwerty"; int n; n= 6 n = strlen ( q ); ! При определении длины символ '' не учитывается! 18

19 Функции для работы со строками Сравнение строк (string comparison) int strcmp(const char *, 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 Функции для работы со строками Пример решения задачи Задача: ввести строку и определить, 20 Функции для работы со строками Пример решения задачи Задача: ввести строку и определить, сколько в ней слов. Программа должна работать только при вводе правильного пароля. Идея решения: • проверка пароля – через strcmp • количество слов = количеству первых букв слова • первая буква: пробел и за ним «не пробел» В а с я п о ш е л г у л я т ь ¤ ¤ ¤ • исключение: предложение начинается со слова (а не с пробела)

Функции для работы со строками Проверка пароля #include <string. h> void main() { char Функции для работы со строками Проверка пароля #include void main() { char secret[] = "123", pass[20]; если пароль printf ( "Введите парольn" ); неверный. . . gets ( pass ); if ( strcmp ( pass, secret ) != 0 ) { printf ( "Пароль неверный" ); сообщить об getch (); ошибке и выйти return 1; из программы } аварийное . . . завершение, } код ошибки 1 21

Функции для работы со строками Основная часть программы #include <stdio. h> #include <string. h> Функции для работы со строками Основная часть программы #include #include void main() { char q[80]; предыдущий слайд int i, len, count = 0; . . . /* проверка пароля */ printf ("Введите предложениеn"); gets ( q ); особый случай len = strlen( q ); если нашли if ( q[0] != ' ') count++; пробел, а за ним for ( i = 0; i < len - 1; i ++ ) не пробел… if ( q[i] == ' ' && q[i+1] != ' ' ) count ++; printf ( "Найдено %d слов", count ); } 22

Функции для работы со строками Упражнения 1. Ввести предложение и определить, сколько слов заканчиваются Функции для работы со строками Упражнения 1. Ввести предложение и определить, сколько слов заканчиваются на букву 'а'. Пример: Введите предложение: Мама мыла раму Декан пропил бутан Найдено слов: 2 Нет таких слов 2. Ввести предложение и разобрать его на отдельные слова: Пример: Введите предложение: Мама мыла раму Результат: Мама Подсказка: для вывода одного символа мыла используйте функцию putchar(символ). раму Например: putchar(q[i]); putchar('n'); // переход на новую строку 23

24 Функции для работы со строками Копирование строк (string copy) char *strcpy(char *to. Here, 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 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. 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] = 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] = Функции для работы со строками Копирование строк копирование внутри одной строки 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 = копирование второй строки 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 Функции для работы со строками Проблемы при копировании строк • не хватает места 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 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. Ввести полный адрес файла (возможно, без расширения) Функции для работы со строками Упражнения 1. Ввести полный адрес файла (возможно, без расширения) и изменить его расширение на «. exe» . Пример: Введите имя файла: C: DOC. TXTqqq. com Результат: C: DOC. TXTqqq. exe 2. Ввести в одной строке фамилию, имя и отчество. Вывести приветствие, где останутся имя и фамилия (см. пример). Пример: Введите ФИО: Пупкин Василий Иванович Результат: Привет, Василий Пупкин! 33

Функции для работы со строками Поиск в символьных строках Задача: найти заданный символ или Функции для работы со строками Поиск в символьных строках Задача: найти заданный символ или сочетание символов (подстроку) в символьной строке. ! Функции поиска в Си возвращают адрес найденного символа или подстроки! Если образец не найден, возвращается NULL (нулевой адрес). Указатель – это переменная в которую можно записать адрес другой переменной заданного типа. 34

35 Функции для работы со строками Поиск символа (первого c начала строки) char *strchr(const 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 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 Функции для работы со строками Пример решения задачи Задача: ввести предложение и определить, 37 Функции для работы со строками Пример решения задачи Задача: ввести предложение и определить, сколько раз в нем встречается имя «Вася» . Проблема: функция strstr ищет только с начала строки. Алгоритм: 1. Записать адрес начала строки в указатель start. 2. Искать подстроку «Вася» , начиная с адреса start. p = strstr( start, "Вася"); 3. Если не нашли, выход из цикла. 4. Увеличить счетчик найденных слов. 5. Переставить start на адрес после найденного слова. 6. Перейти к шагу 2. start В а p с я и В а с я ! ! !

Функции для работы со строками Программа void main() адрес начало поиска { найденного char Функции для работы со строками Программа 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

Организация курса Функции преобразования строк в числа <stdlib. h> Строка в целое int atoi(const Организация курса Функции преобразования строк в числа Строка в целое int atoi(const char *str); Cтрока в число с плавающей точкой double atof(const char *str); Строка в целое int strtol(const char *str, char **endptr); Cтрока в число с плавающей точкой double strtod(const char *str, char **endptr); 39

Организация курса 40 Функции преобразования в(из) строку(и) <stdio. h> Вывод в строку int sscanf(const Организация курса 40 Функции преобразования в(из) строку(и) Вывод в строку int sscanf(const char *s, const char *format, . . . ); Ввод из строки int sprintf(char *s, const char *format, . . . ); char sto[100], sfrom[] = “ 1234. 5"; float a = 3. 1415; sprintf(sto, “%8. 5 f”, a); sscanf(sfrom, “%f”, &a);

Функции для работы со строками Упражнения 1. Ввести предложение и заменить все имена «Вася» Функции для работы со строками Упражнения 1. Ввести предложение и заменить все имена «Вася» на «Юра» . Пример: Введите предложение: Вася, Вася и Вася!!! Результат: Юра, Юра и Юра!!! 2. Ввести предложение и заменить все имена «Юра» на «Вася» . Пример: Введите предложение: Юра, Юра и Юра!!! Результат: Вася, Вася и Вася!!! 41

Строки как параметры функций n n Передача параметров-строк Примеры функций со строковыми параметрами Строки как параметры функций n n Передача параметров-строк Примеры функций со строковыми параметрами

43 Строки как параметры функций Символьные строки в функциях ! • строки передаются в 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[] ) длину строки 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. Разработать функцию, которая переставляет пары соседних символов. Пример: Строки как параметры функций Упражнения 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 ( Строки как параметры функций Символьные строки в функциях Основная программа 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. Разработать функцию, которая определяет, верно ли, что слово Строки как параметры функций Упражнения 1. Разработать функцию, которая определяет, верно ли, что слово – палиндром. Пример: Введите слово: казак кунак Результат: Это палиндром. Не палиндром. 2. Разработать функцию, которая определяет, верно ли, что предложение (с пробелами) – палиндром. Пример: Введите предложение: а роза упала на лапу азора Результат: Это палиндром. 48

49 Вопросы и ответы Вопросы? n Строки: общие сведения ¨ ¨ ¨ n Функции 49 Вопросы и ответы Вопросы? n Строки: общие сведения ¨ ¨ ¨ n Функции для работы со строками ¨ ¨ ¨ n Массивы символов Символьные строки Объявление строк Указатели и строки Ввод и вывод строк Длина строки Сравнение строк Копирование строк Объединение строк Поиск в строке Строки как параметры функций ¨ ¨ Передача параметров-строк Примеры функций со строковыми параметрами Дубовая роща. Девочка и апельсин