Слайд 1Строки
Алтайский государственный университет
Математический факультет
Кафедра информатики
Барнаул 2013
Слайд 3План
Лекция 13
Строки: общие сведения
Функции для работы со строками
Строки как параметры
функций
Слайд 4Несколько заданий
для самопроверки
Слайд 5Три задания для самопроверки
Задание 1
Что описывают следующие объявления?
void *comp() ;
void
(*cmp)();
char (*(*x())[])();
comp – функция, возвращающая указатель на void
cmp
– указатель на функцию, возвращающую void
x – функция, возвращающая указатель на массив из указателей на функции, возвращающие char
Слайд 6Три задания для самопроверки
Задание 2
Что выведет на экран следующая программа?
#include
void main() {
int const * p=5;
printf("%d",++(*p));
}
При
компиляции
возникнет ошибка:
попытка изменить константное значение по указателю
Слайд 7Три задания для самопроверки
Задание 3
Что выведет на экран следующая программа?
#include
void main() {
int A[]={2,5,7,3,4}, *p=A+3;
printf("%d%d",p[-2],-1[p]);
}
57
Слайд 8Строки:
общие сведения
Массивы символов
Символьные строки
Объявление строк
Указатели и строки
Ввод и вывод
строк
Слайд 9Строки: общие сведения
Чем плох массив символов?
char A[4] = { 'A',
'3', '[', 'Ж'};
char B[10];
Это массивы символов:
Для массива:
каждый символ –
отдельный объект;
массив имеет длину N, которая задана при объявлении
Что нужно:
обрабатывать последовательность символов как единое целое
строка должна иметь переменную длину
Слайд 10Строки: общие сведения
Символьные строки
рабочая часть
s[0]
s[1]
s[2]
s[3]
char s[80];
признак окончания строки: символ с
кодом 0
Символьная строка – это последовательность символов, которая заканчивается символом
'\0'.
Слайд 11Строки: общие сведения
Объявление символьных строк
Объявить строку = выделить ей место
в памяти и присвоить имя.
char s[80];
char s1[80] = "abc";
char
qqq[] = "Вася";
выделяется 80 байт, в строке – «мусор» (если она глобальная, то нули '\0‘)
выделяется 80 байт, занято 4 байта
(с учетом '\0')
выделяется 5 байт
(с учетом '\0')
Слайд 12Строки: общие сведения
Указатели и символьные строки
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" */
Слайд 13Строки: общие сведения
Ввод и вывод символьных строк
Задача: ввести слово с
клавиатуры и заменить все буквы «а» на буквы «б».
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]
Слайд 14Строки: общие сведения
Ввод одного слова:
Ввод строки с пробелами:
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 );
Слайд 15Строки: общие сведения
Универсальный способ:
Только для одной строки:
printf ( "Результат: %s",
q );
Вывод символьных строк
puts ( q );
можно выводить сразу и
другую информацию: надписи, значения переменных, …
вывод только одной строки
после вывода – переход на новую строку
printf ( "%s\n", q );
Слайд 16Строки: общие сведения
Упражнения
1. Ввести символьную строку и заменить
все буквы "а" на буквы "б" и наоборот, как заглавные,
так и строчные.
Пример:
Введите строку:
ааббссААББСС
Результат:
ббаассББААСС
2. Ввести символьную строку и проверить, является ли она палиндромом (палиндром читается одинаково в обоих направлениях).
Пример: Пример:
Введите строку: Введите строку:
АБВГДЕ КАЗАК
Результат: Результат:
Не палиндром. Палиндром.
Слайд 17Функции для
работы со строками
Длина строки
Сравнение строк
Копирование строк
Объединение строк
Поиск в
строке
Слайд 18Функции для работы со строками
Функции для работы со строками
Длина строки:
(string length)
size_t strlen(const char *)
Подключение библиотеки:
#include
char q[80] =
"qwerty";
int n;
n = strlen ( q );
n = 6
Слайд 19Функции для работы со строками
Сравнение строк (string comparison)
char q1[80], q2[80];
int
n;
gets ( q1 );
gets ( q2 );
n = strcmp (
q1, q2 );
int strcmp(const char *, const char *)
Слайд 20Функции для работы со строками
Пример решения задачи
Задача: ввести строку и
определить, сколько в ней слов. Программа должна работать только при
вводе правильного пароля.
Идея решения:
проверка пароля – через strcmp
количество слов = количеству первых букв слова
первая буква: пробел и за ним «не пробел»
исключение: предложение начинается со слова (а не с пробела)
Слайд 21Функции для работы со строками
Проверка пароля
#include
void main()
{
char secret[]
= "123", pass[20];
printf ( "Введите пароль\n" );
gets (
pass );
if ( strcmp ( pass, secret ) != 0 )
{
printf ( "Пароль неверный" );
getch ();
return 1;
}
...
}
если пароль неверный...
сообщить об ошибке и выйти из программы
аварийное завершение, код ошибки 1
Слайд 22Функции для работы со строками
Основная часть программы
#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 );
}
особый случай
если нашли пробел, а за ним не пробел…
предыдущий слайд
Слайд 23Функции для работы со строками
Подсказка: для вывода одного символа используйте
функцию putchar(символ). Например:
Упражнения
1. Ввести предложение и определить, сколько
слов заканчиваются на букву 'а'.
Пример:
Введите предложение: Введите предложение:
Мама мыла раму Декан пропил бутан
Найдено слов: 2 Нет таких слов
2. Ввести предложение и разобрать его на отдельные слова:
Пример:
Введите предложение:
Мама мыла раму
Результат:
Мама
мыла
раму
putchar(q[i]);
putchar('\n'); // переход на новую строку
Слайд 24Функции для работы со строками
Копирование строк (string copy)
char *strcpy(char *toHere,
const char *fromHere);
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]
Слайд 25Функции для работы со строками
Копирование строк
копирование в середину строки
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]
Слайд 26Функции для работы со строками
Копирование строк (копирование n символов)
char *strncpy(char
*toHere,
const char
*fromHere,
size_t n);
char q1[10] = "qwerty", q2[10] = "01234";
strncpy ( q1+2, q2, 2 );
q2
q1
q1+2 = &q1[2]
Слайд 27Функции для работы со строками
Копирование строк
копирование строки-константы
char q1[10] = "qwerty";
strcpy
( q1+1, "ABCD");
q1
char q1[10] = "qwerty";
strcpy ( "ABCD", q1+2 );
НЕ
Слайд 28Функции для работы со строками
Копирование строк
копирование внутри одной строки
char q[10]
= "012345";
strcpy ( q, q+2 );
q
char q[10] = "012345";
strcpy (
q+2, q );
q
Зацикливание и зависание компьютера!
Слайд 29Функции для работы со строками
Объединение строк
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
char *strcat(char *dest, const char *src);
Слайд 30Функции для работы со строками
что-то другое
Проблемы при копировании строк
char q1[]
= "qwer", q2[10] = "01234";
strcpy ( q1+2, q2 );
не хватает
места для строки-результата
q2
q1
зацикливание при копировании в ту же строку «слева направо»
char q[10] = "01234";
strcpy ( q+2, q );
Слайд 31Функции для работы со строками
Пример решения задачи
Задача: ввести имя файла
(без пути) и поменять его расширение на ".exe".
Пример:
Введите имя файла: Введите имя файла:
vasya.html vasya
Результат: Результат:
vasya.exe vasya.exe
Алгоритм:
найти точку в имени файла
если она есть, скопировать в это место строку-константу ".exe"
если точки нет, добавить в конец строки ".exe"
Слайд 32Функции для работы со строками
Программа
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 );
}
поиск точки
дошли до конца строки
меняем или добавляем расширение
Слайд 33Функции для работы со строками
Упражнения
1. Ввести полный адрес
файла (возможно, без расширения) и изменить его расширение на «.exe».
Пример:
Введите имя файла: Введите имя файла:
C:\DOC.TXT\qqq C:\DOC.TXT\qqq.com
Результат: Результат:
C:\DOC.TXT\qqq.exe C:\DOC.TXT\qqq.exe
2. Ввести в одной строке фамилию, имя и отчество. Вывести приветствие, где останутся имя и фамилия (см. пример).
Пример:
Введите ФИО:
Пупкин Василий Иванович
Результат:
Привет, Василий Пупкин!
Слайд 34Функции для работы со строками
Поиск в символьных строках
Задача: найти заданный
символ или сочетание символов (подстроку) в символьной строке.
Указатель – это
переменная в которую можно записать адрес другой переменной заданного типа.
Слайд 35Функции для работы со строками
Поиск символа (первого c начала строки)
char
*strchr(const char *, int)
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
Слайд 36Функции для работы со строками
Поиск подстроки (первой с начала строки)
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
char *strstr(const char *str, const char *substr);
Слайд 37Функции для работы со строками
Пример решения задачи
Задача: ввести предложение и
определить, сколько раз в нем встречается имя «Вася».
Проблема: функция
strstr ищет только с начала строки.
Алгоритм:
Записать адрес начала строки в указатель start.
Искать подстроку «Вася», начиная с адреса start.
Если не нашли, выход из цикла.
Увеличить счетчик найденных слов.
Переставить start на адрес после найденного слова.
Перейти к шагу 2.
start
p
p = strstr( start, "Вася");
Слайд 38Функции для работы со строками
Программа
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 );
}
начало поиска
адрес найденного слова
Слайд 39Организация курса
Строка в целое
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);
Функции преобразования строк в числа
Слайд 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.5f”, a);
sscanf(sfrom, “%f”, &a);
Слайд 41Функции для работы со строками
Упражнения
1. Ввести предложение и заменить
все имена «Вася» на «Юра».
Пример:
Введите предложение:
Вася,
Вася, Вася и Вася!!!
Результат:
Юра, Юра, Юра и Юра!!!
2. Ввести предложение и заменить все имена «Юра» на «Вася».
Пример:
Введите предложение:
Юра, Юра, Юра и Юра!!!
Результат:
Вася, Вася, Вася и Вася!!!
Слайд 42Строки как
параметры функций
Передача параметров-строк
Примеры функций со строковыми параметрами
Слайд 43Строки как параметры функций
Символьные строки в функциях
Задача: составить процедуру, которая
переставляет символы строки в обратном порядке.
Алгоритм:
определить длину строки len;
все
символы первой половины переставить с соответствующими символами второй половины:
c = s[i];
s[i] = s[len-i-1];
s[len-1-i] = c;
s[i]
s[len-1-i]
Слайд 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
длину строки определяем на месте
Слайд 45Строки как параметры функций
Упражнения
1. Разработать функцию, которая переставляет
пары соседних символов.
Пример:
Введите предложение:
Вася пошел гулять!
Результат:
аВясп шолег лутя!ь
2. Разработать функцию, которая удаляет все лишние пробелы (в начале предложения и сдвоенные пробелы).
Пример:
Введите предложение:
Вася пошел гулять!
Результат:
Вася пошел гулять!
Слайд 46Строки как параметры функций
Символьные строки в функциях
Задача: составить функцию, которая
находит количество цифр в строке.
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' )
Слайд 47Строки как параметры функций
Символьные строки в функциях
Основная программа
int NumDigits (
char s[] )
{
...
}
void main()
{
char s[80];
int n;
printf (
"Введите строку\n" );
gets ( s );
n = NumDigits ( s );
printf ( "Нашли %d цифр.", s );
}
Слайд 48Строки как параметры функций
Упражнения
1. Разработать функцию, которая определяет,
верно ли, что слово – палиндром.
Пример:
Введите слово:
Введите слово:
казак кунак
Результат: Результат:
Это палиндром. Не палиндром.
2. Разработать функцию, которая определяет, верно ли, что предложение (с пробелами) – палиндром.
Пример:
Введите предложение:
а роза упала на лапу азора
Результат:
Это палиндром.
Слайд 49Вопросы и ответы
Вопросы?
Строки: общие сведения
Массивы символов
Символьные строки
Объявление строк
Указатели и строки
Ввод
и вывод строк
Функции для работы со строками
Длина строки
Сравнение строк
Копирование строк
Объединение
строк
Поиск в строке
Строки как параметры функций
Передача параметров-строк
Примеры функций со строковыми параметрами
Дубовая роща. Девочка и апельсин