Строки. Функции для работы со строками. Строки, как параметры функций. (Лекция 12)

Содержание

Слайд 2

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

План

Лекция 12

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

Слайд 3

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

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

Слайд 4

Пара заданий для самопроверки Задание 1 Есть ли в следующем фрагменте

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

Задание 1

Есть ли в следующем фрагменте кода ошибка

и, если есть, в чем она состоит?

struct outer{
int a;
struct inner{
char c;
};
};

(a) В Си не разрешены вложенные структуры
(b) Необходимо инициализировать поля структуры
(c) Внутренняя структура должна иметь имя
(d) Внешняя структура должна иметь имя
(e) Нет никаких ошибок


Слайд 5

Пара заданий для самопроверки Задание 2 Что выведет на экран следующая

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

Задание 2

Что выведет на экран следующая программа?

#include
struct

node {int a; int b; int c;};
void main() {
struct node s={2,5,7};
struct node *p=&s;
printf("%d",*((int*)p));
}

2

Слайд 6

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

Строки: общие сведения

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

Слайд 7

Строки: общие сведения Чем плох массив символов? char A[4] = {

Строки: общие сведения

Чем плох массив символов?

char A[4] = { 'A', '3',

'[', 'Ж'};
char B[10];

Это массивы символов:

Для массива:
каждый символ – отдельный объект;
массив имеет длину N, которая задана при объявлении

Что нужно:
обрабатывать последовательность символов как единое целое
строка должна иметь переменную длину

Слайд 8

Строки: общие сведения Символьные строки рабочая часть s[0] s[1] s[2] s[3]

Строки: общие сведения

Символьные строки

рабочая часть

s[0]

s[1]

s[2]

s[3]

char s[80];

признак окончания строки: символ с кодом

0

Символьная строка – это последовательность символов, которая заканчивается символом '\0'.

Слайд 9

Строки: общие сведения Объявление символьных строк Объявить строку = выделить ей

Строки: общие сведения

Объявление символьных строк

Объявить строку = выделить ей место в

памяти и присвоить имя.
char s[80];
char s1[80] = "abc";
char qqq[] = "Вася";

выделяется 80 байт, в строке – «мусор» (если она глобальная, то нули '\0‘)

выделяется 80 байт, занято 4 байта (с учетом '\0')

выделяется 5 байт
(с учетом '\0')

Слайд 10

Строки: общие сведения Указатели и символьные строки char str[10] = "0123456";

Строки: общие сведения

Указатели и символьные строки

char str[10] = "0123456";
char *p;
p

= str;
*p = 'A';
p ++;
*p = 'B';
p ++;
strcpy ( p, "CD" );
strcat ( p, "qqq" );
puts ( p );

/* указатель на символ */
/* или & str[0] */
/* "A12345" */
/* перейти к str[1] */
/* "AB2345“ */
/* перейти к str[2] */
/* "ABCD" */
/* "ABCDqqq" */

Слайд 11

Строки: общие сведения Ввод и вывод символьных строк Задача: ввести слово

Строки: общие сведения

Ввод и вывод символьных строк

Задача: ввести слово с клавиатуры

и заменить все буквы «а» на буквы «б».

void main()
{
char q[80];
int i;
printf("Введите строку\n");
scanf( "%s", q);
i = 0;
while ( q[i] != '\0' ) {
if ( q[i] == 'а' ) q[i] = 'б';
i ++;
}
printf ( "Результат: %s ", q );
}

%s

не надо ставить &:
q ⇔ &q[0]

%s – формат для ввода и вывода символьных строк (выводится только часть до '\0'

"%s"

пока не дошли до конца строки

переход к следующему символу

начали с q[0]

Слайд 12

Строки: общие сведения Ввод одного слова: Ввод строки с пробелами: char

Строки: общие сведения

Ввод одного слова:
Ввод строки с пробелами:

char q[80];
printf ("Введите текст:\n");
scanf

( "%s", q );
printf ("Введено:\n%s", q );

Ввод символьных строк

Введите текст:
Вася пошел гулять
Введено: Вася

char q[80];
printf("Введите текст:\n");
gets ( q );
printf("Введено:\n%s", q );

Введите текст:
Вася пошел гулять
Введено: Вася пошел гулять

gets ( q );

Слайд 13

Строки: общие сведения Универсальный способ: Только для одной строки: printf (

Строки: общие сведения

Универсальный способ:
Только для одной строки:

printf ( "Результат: %s", q

);

Вывод символьных строк

puts ( q );

можно выводить сразу и другую информацию: надписи, значения переменных, …

вывод только одной строки
после вывода – переход на новую строку

printf ( "%s\n", q );

Слайд 14

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

Функции для работы со строками

Длина строки
Сравнение строк
Копирование строк
Объединение строк
Поиск в строке

Слайд 15

Функции для работы со строками Функции для работы со строками Длина

Функции для работы со строками

Функции для работы со строками

Длина строки: strlen

(string length)

Подключение библиотеки:

#include

char q[80] = "qwerty";
int n;
n = strlen ( q );

n = 6

Слайд 16

Функции для работы со строками Сравнение строк char q1[80], q2[80]; int

Функции для работы со строками

Сравнение строк

char q1[80], q2[80];
int n;
gets ( q1

);
gets ( q2 );
n = strcmp ( q1, q2 );

strcmp (string comparison):

Слайд 17

Функции для работы со строками Пример решения задачи Задача: ввести строку

Функции для работы со строками

Пример решения задачи

Задача: ввести строку и определить,

сколько в ней слов. Программа должна работать только при вводе правильного пароля.
Идея решения:
проверка пароля – через strcmp
количество слов = количеству первых букв слова
первая буква: пробел и за ним «не пробел»
исключение: предложение начинается со слова (а не с пробела)
Слайд 18

Функции для работы со строками Проверка пароля #include void main() {

Функции для работы со строками

Проверка пароля

#include
void main()
{
char secret[] =

"123", pass[20];
printf ( "Введите пароль\n" );
gets ( pass );
if ( strcmp ( pass, secret ) != 0 )
{
printf ( "Пароль неверный" );
getch ();
return 1;
}
...
}

если пароль неверный...

сообщить об ошибке и выйти из программы

аварийное завершение, код ошибки 1

Слайд 19

Функции для работы со строками Основная часть программы #include #include void

Функции для работы со строками

Основная часть программы

#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 );
}

особый случай

если нашли пробел, а за ним не пробел…

предыдущий слайд

Слайд 20

Функции для работы со строками Копирование строк strcpy (string copy) char

Функции для работы со строками

Копирование строк

strcpy (string copy)

char q1[10] = "qwerty",

q2[10] = "01234";
strcpy ( q1, q2 );

куда

откуда

копирование «хвоста» строки

char q1[10] = "qwerty", q2[10] = "01234";
strcpy ( q1, q2+2 );

q2

q1

q2 = &q2[0]

q2+2 = &q2[2]

Слайд 21

Функции для работы со строками Копирование строк копирование в середину строки

Функции для работы со строками

Копирование строк

копирование в середину строки

char q1[10] =

"qwerty", q2[10] = "01234";
strcpy ( q1+2, q2 );

q2

q1

q1+2 = &q1[2]

char q1[10] = "qwerty", q2[10] = "01234";
strcpy ( q1+2, q2+3 );

q2

q1

q2+3 = &q2[3]

q1+2 = &q1[2]

Слайд 22

Функции для работы со строками Копирование строк strncpy – копирование нескольких

Функции для работы со строками

Копирование строк

strncpy – копирование нескольких символов

char q1[10]

= "qwerty", q2[10] = "01234";
strncpy ( q1+2, q2, 2 );

q2

q1

q1+2 = &q1[2]

Слайд 23

Функции для работы со строками Копирование строк копирование строки-константы char q1[10]

Функции для работы со строками

Копирование строк

копирование строки-константы

char q1[10] = "qwerty";
strcpy (

q1+1, "ABCD");

q1

char q1[10] = "qwerty";
strcpy ( "ABCD", q1+2 );

НЕ

Слайд 24

Функции для работы со строками Копирование строк копирование внутри одной строки

Функции для работы со строками

Копирование строк

копирование внутри одной строки

char q[10] =

"012345";
strcpy ( q, q+2 );

q

char q[10] = "012345";
strcpy ( q+2, q );

q

Зацикливание и зависание компьютера!

Слайд 25

Функции для работы со строками Объединение строк strcat (string concatenation) =

Функции для работы со строками

Объединение строк

strcat (string concatenation) = копирование второй

строки в конец первой

char q1[10] = "qwe", q2[10] = "0123";
strcat ( q1, q2 );

q2

q1

char q1[10] = "qwe", q2[10] = "0123";
strcat ( q1, q2+2 );

q2

q1

Слайд 26

Функции для работы со строками что-то другое Проблемы при копировании строк

Функции для работы со строками

что-то другое

Проблемы при копировании строк

char q1[] =

"qwer", q2[10] = "01234";
strcpy ( q1+2, q2 );

не хватает места для строки-результата

q2

q1

зацикливание при копировании в ту же строку «слева направо»

char q[10] = "01234";
strcpy ( q+2, q );

Слайд 27

Функции для работы со строками Пример решения задачи Задача: ввести имя

Функции для работы со строками

Пример решения задачи

Задача: ввести имя файла (без

пути) и поменять его расширение на ".exe".
Пример:
Введите имя файла: Введите имя файла:
vasya.html vasya
Результат: Результат:
vasya.exe vasya.exe
Алгоритм:
найти точку в имени файла
если она есть, скопировать в это место строку-константу ".exe"
если точки нет, добавить в конец строки ".exe"
Слайд 28

Функции для работы со строками Программа void main() { char fName[80];

Функции для работы со строками

Программа

void main()
{
char fName[80];
int i;
printf("Введите имя файла\n");
gets ( fName

);
i = 0;
while ( fName[i] != '.' ) {
if ( fName[i] == '\0' ) break;
i ++;
}
if ( fName[i] == '.' )
strcpy ( fName+i, ".exe" );
else strcat ( fName, ".exe" );
puts ( "Результат:" );
puts ( fName );
}

поиск точки

дошли до конца строки

меняем или добавляем расширение

Слайд 29

Функции для работы со строками Поиск в символьных строках Задача: найти

Функции для работы со строками

Поиск в символьных строках

Задача: найти заданный символ

или сочетание символов (подстроку) в символьной строке.

Указатель – это переменная в которую можно записать адрес другой переменной заданного типа.

Слайд 30

Функции для работы со строками Поиск символа strchr: найти первый заданный

Функции для работы со строками

Поиск символа

strchr: найти первый заданный символ c

начала строки

strrchr: найти последний заданный символ в строке

char q[10] = "abcdabcd";
char *p;
int nomer;
p = strchr(q, 'b');
if ( p == NULL )
printf ( "Не нашли..." );
else {
nomer = p – q;
printf ( "Номер символа %d", nomer );
}

q

q+1

q+5

p

reverse

Слайд 31

Функции для работы со строками Поиск подстроки strstr: найти первую подстроку

Функции для работы со строками

Поиск подстроки

strstr: найти первую подстроку c начала

строки

char q[10] = "abcdabcd";
char *p;
int nomer;
p = strstr(q, "bcd");
if ( p == NULL )
printf ( "Не нашли..." );
else {
nomer = p – q;
printf ( "Номер первого символа %d", nomer );
}

q

q+1

q+5

p

Слайд 32

Функции для работы со строками Пример решения задачи Задача: ввести предложение

Функции для работы со строками

Пример решения задачи

Задача: ввести предложение и определить,

сколько раз в нем встречается имя «Вася».
Проблема: функция strstr ищет только с начала строки.
Алгоритм:
Записать адрес начала строки в указатель start.
Искать подстроку «Вася», начиная с адреса start.
Если не нашли, выход из цикла.
Увеличить счетчик найденных слов.
Переставить start на адрес после найденного слова.
Перейти к шагу 2.

start

p

p = strstr( start, "Вася");

Слайд 33

Функции для работы со строками Программа void main() { char q[80],

Функции для работы со строками

Программа

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 );
}

начало поиска

адрес найденного слова

Слайд 34

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

Строки как параметры функций

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

Слайд 35

Строки как параметры функций Символьные строки в функциях Задача: составить процедуру,

Строки как параметры функций

Символьные строки в функциях

Задача: составить процедуру, которая переставляет

символы строки в обратном порядке.
Алгоритм:
определить длину строки len;
все символы первой половины переставить с соответствующими символами второй половины:

c = s[i];
s[i] = s[len-i-1];
s[len-1-i] = c;

s[i]

s[len-1-i]

Слайд 36

Строки как параметры функций Программа void Reverse ( char s[] )

Строки как параметры функций

Программа

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

длину строки определяем на месте

Слайд 37

Строки как параметры функций Символьные строки в функциях Задача: составить функцию,

Строки как параметры функций

Символьные строки в функциях

Задача: составить функцию, которая находит

количество цифр в строке.

int NumDigits ( 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' )

Слайд 38

Строки как параметры функций Символьные строки в функциях Основная программа int

Строки как параметры функций

Символьные строки в функциях

Основная программа

int NumDigits ( char

s[] )
{
...
}
void main()
{
char s[80];
int n;
printf ( "Введите строку\n" );
gets ( s );
n = NumDigits ( s );
printf ( "Нашли %d цифр.", s );
}