Строковый тип данных. С / С++. Тема 07

Содержание

Слайд 2

НРТК, 2022 г. Строковый тип данных Созонов А.А. Строки в C

НРТК, 2022 г. Строковый тип данных Созонов А.А.

Строки в C

/ C++

Специального типа данных «строка» нет (в смысле набора значений и операций)
Строки объявляются как массивы типа char
char str[15];
Операции над строками обеспечиваются специальной библиотекой

Слайд 3

НРТК, 2022 г. Строковый тип данных Созонов А.А. Строки в C

НРТК, 2022 г. Строковый тип данных Созонов А.А.

Строки в C

/ C++

Можно присваивать значение при инициализации:
char str[15] = "Вова+Лена";
Массив при этом заполняется слева-направо, последним заносится нулевой байт (признак конца), далее — нули:

Слайд 4

НРТК, 2022 г. Строковый тип данных Созонов А.А. Строки в C

НРТК, 2022 г. Строковый тип данных Созонов А.А.

Строки в C

/ C++: ввод

С++: потоковый ввод-вывод
cin >> str;
C: форматный ввод-вывод (stdio.h)
scanf("%s", str);
Вводят значения, разделенные пробелами (т. е. нельзя ввести строку, содержащую пробелы)
Не контролируют длину строки
проблема переполнения буфера

Слайд 5

НРТК, 2022 г. Строковый тип данных Созонов А.А. Строки в C

НРТК, 2022 г. Строковый тип данных Созонов А.А.

Строки в C

/ C++: ввод

С++: потоковый ввод-вывод:
cin.getline(char s[], size_t count);
пример:
const int str_len = 20 + 1; // +1 – под \0
char str[str_len];
cin.getline(str, str_len);
C: форматный ввод-вывод (stdio.h)
char* gets(char s[]);
пример:
const int str_len = 20 + 1;
char str[str_len];
char* s = gets(st);
gets(st);
В C остается возможность переполнить буфер

Слайд 6

НРТК, 2022 г. Строковый тип данных Созонов А.А. Строки в C

НРТК, 2022 г. Строковый тип данных Созонов А.А.

Строки в C

/ C++: вывод

С++: потоковый ввод-вывод:
cout << str;
C: форматный ввод-вывод (stdio.h)
вывод по-умолчанию
printf("%s", str);
вывод n символов строки
printf("%ns", str);
вывод без формата (никогда так не делайте!)
printf(str);

Слайд 7

НРТК, 2022 г. Строковый тип данных Созонов А.А. Пример: ввод текста

НРТК, 2022 г. Строковый тип данных Созонов А.А.

Пример: ввод текста

const

MAXT = 100;
char txt[MAXT][80];
int nt = 0;
do
{
cin.getline(txt[nt++], 80);
} while ( nt <= MAXT && txt[nt – 1] != “” );
Слайд 8

НРТК, 2022 г. Строковый тип данных Созонов А.А. Библиотека cstring (string.h)

НРТК, 2022 г. Строковый тип данных Созонов А.А.

Библиотека cstring (string.h)

Определение

длины строки str:
size_t strlen(const char str[]);
пример:
size_t l = strlen("Вова = ?"); // l = 8
Сравнение строк s и d:
int strcmp(const char s[], const char d[]);
пример:
r1 = strcmp("Волк", "Воля"); // r1 < 0
r2 = strcmp("Волк", "Валя"); // r2 > 0
r3 = strcmp("Волк", "Волк”); // r3 = 0

Подробнее

Слайд 9

НРТК, 2022 г. Строковый тип данных Созонов А.А. Библиотека cstring (string.h)

НРТК, 2022 г. Строковый тип данных Созонов А.А.

Библиотека cstring (string.h)

Копирование

строки s в d:
char* strcpy(char d[], const char s[]);
пример:
const int str_len = 20 + 1; // +1 – под \0
char str[str_len];
strcpy(str, "Лена"); // В str — «Лена»
проблема — переполнение буфера
Копирование не более n символов строки s в d:
char* strncpy(char d[], const char s[],
size_t n);
пример:
strncpy(str, "Лена", str_len);
если s длиннее d, то функция «забывает» финальный 0

Подробнее

Слайд 10

НРТК, 2022 г. Строковый тип данных Созонов А.А. Библиотека cstring (string.h)

НРТК, 2022 г. Строковый тип данных Созонов А.А.

Библиотека cstring (string.h)

Объединение

(конкатенация) строк s и d:
char* strcat(char d[], const char s[]);
пример:
char str[str_len] = "Вова+";
strcat(str, "Лена"); // В s1 — «Вова+Лена»
проблема — переполнение буфера
Объединение строки s и не более, чем n символов строки d:
char* strncat(char d[], char s[], size_t n);
пример:
char str[str_len + 1] = "Вова+";
strncat(str, "Лена", str_len); // «Вова+Лена»
проблема — переполнение буфера

Подробнее

Слайд 11

НРТК, 2022 г. Строковый тип данных Созонов А.А. Пример: StrLen Определение

НРТК, 2022 г. Строковый тип данных Созонов А.А.

Пример: StrLen

Определение длины

строки:
size_t StrLen(const char str[])
{
size_t len = 0;
while ( str[len++] ) ;
return len - 1;
}
Слайд 12

НРТК, 2022 г. Строковый тип данных Созонов А.А. Копирование символов строки

НРТК, 2022 г. Строковый тип данных Созонов А.А.

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

s в d, с контролем длины строки d (не более n символов, включая 0):
bool StrCopy(char d[], size_t n,
const char s[])
{
// Количество скопированных символов
size_t cnt = 0;
while ( (cnt < n – 1) && (d[cnt] = s[cnt]) )
cnt++;
// В любом случае – запись 0
d[n - 1] = '\0';
return (cnt == StrLen(s));
}

Пример: StrCopy

Слайд 13

НРТК, 2022 г. Строковый тип данных Созонов А.А. Объединение строк s

НРТК, 2022 г. Строковый тип данных Созонов А.А.

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

и d, с контролем длины строки d (не более n символов, включая 0):
bool StrCat(char d[], size_t n,
const char s[])
{
// Количество скопированных символов
size_t cnt = 0;
size_t len = StrLen(d);
while ( (len + cnt < n – 1) &&
(d[len + cnt] = s[cnt]) ) cnt++;
// В любом случае – запись 0
d[n - 1] = '\0';
return (cnt == StrLen(s));
}

Пример: StrCat

Слайд 14

НРТК, 2022 г. Строковый тип данных Созонов А.А. Выводы Программы с

НРТК, 2022 г. Строковый тип данных Созонов А.А.

Выводы

Программы с использованием

строк в стиле C подвержены ошибкам, в C++ есть более безопасные средства для работы со строками
Функции, «увеличивающие» строку обязательно должны знать максимальный размер буфера, используемого для этой строки
Слайд 15

НРТК, 2022 г. Строковый тип данных Созонов А.А. Пример: StrToInt Перевод

НРТК, 2022 г. Строковый тип данных Созонов А.А.

Пример: StrToInt

Перевод строки

str в число:
int StrToInt(const char str[])
{
int num = 0;
int i = 0;
while(str[i] && str[i]>='0' && str[i]<='9')
num = num * 10 + str[i++] - '0';
return num;
}
Библиотечные функции (cstdlib, stdlib.h):
int atoi(char str[]);
sscanf("строка", "формат", <список ввода>);
пример:
sscanf(str, "%i" , &i);
Слайд 16

НРТК, 2022 г. Строковый тип данных Созонов А.А. Пример: IntToStr void

НРТК, 2022 г. Строковый тип данных Созонов А.А.

Пример: IntToStr

void IntToStr(char

str[], int num)
{
int len = 0, nr = num;
// Определение длины строки
do
len++;
while ( nr /= 10 );
str[len] = '\0';
do
str[--len] = '0' + num % 10;
while ( num /= 10 );
}
Слайд 17

НРТК, 2022 г. Строковый тип данных Созонов А.А. int DelSymbol(char str[],

НРТК, 2022 г. Строковый тип данных Созонов А.А.

int DelSymbol(char str[],

char sym)
{
int i = 0, j = 0;
while(str[i])
if(str[i] == sym)
i++;
else
str[j++] = str[i++];
str[j] = '\0';
return i - j;
}

Пример: удаление символа (версия 1)

Слайд 18

НРТК, 2022 г. Строковый тип данных Созонов А.А. Пример: удаление символа

НРТК, 2022 г. Строковый тип данных Созонов А.А.

Пример: удаление символа

(версия 2)

int DelSymbol(char str[], char sym)
{
int i = 0, j = 0;
do
if(str[i] != sym )
str[j++] = str[i];
while(str[i++]);
return i - j;
}

Слайд 19

НРТК, 2022 г. Строковый тип данных Созонов А.А. Пример: анализ палиндрома

НРТК, 2022 г. Строковый тип данных Созонов А.А.

Пример: анализ палиндрома

(версия 1)

DelSymbol(str, ' ');
size_t n = StrLen(str);
size_t i, j = n - 1;
bool res = true;
for ( i = 0; i < n; i++ )
{
if ( str[i] != str[j] )
{
res = false;
break;
}
else j--;
}

Слайд 20

НРТК, 2022 г. Строковый тип данных Созонов А.А. DelSymbol(str, ' ');

НРТК, 2022 г. Строковый тип данных Созонов А.А.

DelSymbol(str, ' ');
size_t

n = strlen(str), i, j;
bool res = true;
for (i = 0, j = n - 1; rez && i < j; i++, j--)
if ( rez = (str[i] == str[j]) ) ;

Пример: анализ палиндрома (версия 2)

Здесь есть ошибка. Где?

Демонстрация