Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Строки и символы (справка).doc
Скачиваний:
2
Добавлен:
20.08.2019
Размер:
202.75 Кб
Скачать

Операции со строками

Строки, как и массивы, нельзя копировать простым присваи­ванием. Это можно делать только посимвольно или при помощи библиотечных функций..

Для строк не определена операция присваивания, поскольку строка является не основным типом данных, а массивом. Присваивание выполняется с помощью функ­ций стандартной библиотеки или посимвольно «вручную» (что менее предпочти­тельно, так как чревато ошибками). Программист должен сам позаботиться о памяти для размещения копии.

Пример. Скопировать строку 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;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]