- •Строки и символы
- •Описание строк
- •Ввод-вывод строк
- •Операции со строками
- •Строковые библиотечные функции
- •Преобразование строки в целое число
- •Работа с символами
- •I. Исходные данные и результаты
- •II. Алгоритм решения задачи
- •I. Исходные данные и результаты
- •II. Алгоритм решения задачи
- •III. Программа и тестовые примеры
Операции со строками
Строки, как и массивы, нельзя копировать простым присваиванием. Это можно делать только посимвольно или при помощи библиотечных функций..
Для строк не определена операция присваивания, поскольку строка является не основным типом данных, а массивом. Присваивание выполняется с помощью функций стандартной библиотеки или посимвольно «вручную» (что менее предпочтительно, так как чревато ошибками). Программист должен сам позаботиться о памяти для размещения копии.
Пример. Скопировать строку s1 в s2.
сhar sa[]=”1234567890”, s2[11];
for (int i=0; s1[i];i++)
s2[i]=s1[i];
s2[i]=0; //ставим замыкающий 0
Строковые библиотечные функции
Функции для работы со строками объявлены в заголовочном файле string.h. Приведем некоторые из них:
Копирование строк
char *strcpy(char *s1, char *s2);
Копирует одну строку в другую. Функция копирует s2 в s1 и возвращает s1.
char *strncpy(char *s1, char *s2, 1size_t n);
Копирует первые n символов одной строки в другую. Функция копирует не более n символов из s2 в s1 и возвращает s1. Если длина исходной строки превышает или равна n, нуль-символ в конец строки s1 не добавляется. В противном случае строка дополняется нуль-символами до n-го символа. Если строки перекрываются, поведение не определено.
Определение длины строки
1size_t strlen(const char *s);
Подсчитывает размер строки. Возвращает количество символов строки без нулевого символа.
Поиск вхождения символа
char *strchr(const char *s, int c);
сканирует строку s в поисках первого вхождения заданного символа с. Нулевой символ можно искать наряду с другими. Возвращает указатель на найденный символ или 0, если символа нет.
char *strrchr(const char *s, int c);
то же, что strchr, но находит последнее вхождение символа с в строку s.
char *strpbrk(char * s1, char *s2);
Ищет один из символов одной строки в другой. Функция возвращает указатель на символ, являющийся первым вхождением любого из символов из s2 в строку s1, если его нет, возвращается NULL.
Поиск подстроки
char *strstr(const char *sl, const char *s2);
находит первое вхождение подстроки s2 в строку si. Возвращает указатель на место первого вхождения или 0, если такового нет.
Сравнение строк
int strcmp(const char *sl, const char*s2);
Сравнивает две строки. Возвращает целое меньше нуля, если si < s2, равное нулю, если si == s2, и большее нуля, если si > s2.
int strncmp(char * s1, char *s2, 1size_t n):
Сравнивает одну строку с n символами другой. Функция сравнивает первую строку и первые п символов второй строки и возвращает отрицательное (если si меньше s2), нулевое (если si равно s2) или положительное (если si больше s2) значение.
Объединение строк
char *strcat(char *s1, char *s2);
Складывает строки. Функция добавляет s2 к s1 и возвращает s1. В конец результирующей строки добавляется нуль-символ.
char *strncat(char * s l , char *s2, 1size_t n);
Складывает одну строку с n символами другой. Функция добавляет не более n символов из s2 к s1 и возвращает s1. Первый символ s2 пишется на место завершающего нуль-символа строки s1. Если длина строки s2 меньше n, переписываются все символы s2. К строке si добавляется нуль-символ. Если строки перекрываются, поведение не определено.
Выделение слов из предложения
char *strtok(char *sl, const char *s2);
Сканирует первую строку в поисках первого участка, не содержащего символов из s2. Первый вызов функции возвращает указатель на начало первого участка и записывает 0 в s1 сразу после конца участка. Последующие вызовы с 0 в качестве 1-го аргумента обрабатывают строку дальше, пока еще есть такие участки. Если их нет, возвращается 0. Функцию применяют для выделения слов из предложения s1. В строке s2 находятся символы-разделители.
Пример. Ввод, клонирование и вывод строки.
@include <string.h>
//……
char s1[80];
cin >> s1;
char *s2 = strdup (s1);
cout <<s1<<s2<<endl;
free (s2);
Замечание. Функция strdup( ) резервирует память для копии при помощи вызова функции malloc(sizet), поэтому программист должен освободить эту память вызовом функции free(void*). Функции malloc( ) и free( ) составляют пару подобно операциям new и delete.
Например, чтобы присвоить строке р строку а, можно воспользоваться функциями strcpy или strncpy:
Для использования этих функций к программе следует подключить заголовочный файл <string.h>.
Функция strcpy (р, а) копирует все символы строки, указанной вторым параметром (а), включая завершающий 0, в строку, указанную первым параметром (р).
Функция strncpy (р, а, n) выполняет то же самое, но не более п символов, то есть числа символов, указанного третьим параметром. Если нуль-символ в исходной строке встретится раньше, копирование прекращается, а оставшиеся до п символы строки. Р заполняются нуль-символами. В противном случае (если п меньше или равно длине строки а) завершающий нуль-символ в р не добавляется. Обе эти функции возвращают указатель на результирующую строку. Если области памяти, занимаемые строкой-назначением и строкой-источником, перекрываются, поведение программы не определено.
Функция strlen(a) возвращает фактическую длину строки а, не включая нуль-символ. Программист должен сам заботиться о том, чтобы в строке-приемнике хватило места для строки-источника (в данном случае при выделении памяти значение переменной m должно быть больше или равно 100), и о том, чтобы строка всегда имела завершающий нуль-символ.
ВНИМАНИЕ
Выход за границы строки и отсутствие нуль-символа являются распространенными причинами ошибок в программах обработки строк.
Пример. Заменить в строке s1 первое вхождение слова а словом b.
int main (int; argc , char* argv[]])
{
char *sl = "I see nothing.";
char *a = "see", *b = "hear";
char s2 [100] ;
.// для начала скопировать всю строку
strcpy(s2 , s1) ;
// установить p1 на слово а в оригинале
char *pl = strstr(sl, а);
// установить р2 на слово а в копии
char *р2 = s2 - si + pi;
// копировать слово b
strcpy(p2, b) ;
// сместить указатель в оригинале
P1 += strlen(a) ;
// сместить указатель в копии
р2 += strlen(b);
// скопировать остаток строки
strcpy(р2, p1);
cout << s2 << endl; return 0;
}