
Семинар №5
Работа со строками
1) Символьная константа "..." ;
2) Одномерный массив символов .
Пример :
char* os = "UNIX" ;
char web[4] ;
web[0] = web[1] = web[2] = 'w' ;
web[3] = '\0' ;
char wm[ ] = "kde"
char wm2[ ] = { 'k', 'd', 'e', '\0' }
unsigned char* str ;
char* str ;
Основные функции работы со строками :
1) Вычисление длины .
2) Копирование .
3) Конкитенация .
4) Сравнение .
5) Поиск .
6) Функция лексического разбора.
Для работа следующих функций необходим заголовочный файл <string.h> .
1. Измерительные функции :
unsigned strlen ( const char* str) ;
- возвращает длину символьной строки по адресу str. Длина в байтах ( и равна количеству символов ) до завершающего кода.
Пример :
printf( "%d \n", strlen("Linux") ) ; // Результат : 5
unsigned strspn ( const char* str, const char* delimit ) ;
- вычисляет максимальную длину начального фрагмента исходной строки по адресу str, который состоит из символов ограничительной строки delimit.
strcspn
- аналогичен предыдущей функции, но вычисляет то, что не содержит ограничительная строка.
Пример :
strspn ("happy", "path") // Результат : 4
strcspn ("happy", "path") // Результат : 0
2. Функции копирования.
char* strcpy ( char* dest , const char* src ) ;
char* strncpy ( char* dest , const char* src , unsigned num ) ;
- обе функции предназначены для копирования исходной строки src в массив символов dest. strcpy копирует целиком, strncpy копирует не более, чем num начальных символов.
При успешном завершении возвращают адрес dest.
Пример :
char os[6] ;
strcpy ( os, "Xenix" ) ; // Результат : Xenix
strncpy ( os, "Mistake" ) ; // Результат : Minix
strncpy ( os, "M", 2 ) ; // Результат : "M" (так как далее идёт \0)
3. Операции конкитенации.
char* strcat ( char* dest , const char* src ) ;
char* strncat ( char* dest , const char* src , unsigned num ) ;
- обе функции выполняют конкитенацию двух строк, добавляя копию всего или части содержимого строки src в конец dest. При слиянии символ с нулевым байтом в dest перекрывается началом из src. В конце конкитенации автоматически добавляется нулевой байт. Результирующая строка находится в dest.
Пример :
char sen[64] ;
strcpy ( sen, "I like " ) ;
strcat ( sen, "C language" ) ;
{ puts(sen) - вывод без форматирования }
4. Операция сравнения (лексиграфическое).
int strcmp( const char* str1 , const char* str2) ;
int strncmp ( const char* str1 , const char* str2, unsigned num) ;
- обе функции выполняют лексиграфическое сравнение строк str1 и str2 , последовательно сопоставляя коды их символов. Обе функции прерывают сравнение, если встретят '\0' . Во многих реализациях ненулевой код возврата равен разности кодов первых несовпадающих символов сравниваемых строк. В некоторых реализациях возвращается -1 (меньше) или 1 (больше).
5. Оператор поиска.
1) char* strchr ( const char* str, int code ) ;
2) char* strrchr ( const char* str, int code ) ;
3) char* strpbrk ( const char* str, const char* key ) ;
4) char* strstr ( const char* str, const char* key ) ;
- указатель str передаёт адрес исходной строки символов, где требуется найти символьный объект, заданный вторым аргументом : code или key.
Первые две функции предназначены для поиска первого (для strchr ) или последнего ( для strrchr ) вхождения символа code в строке str . Возвращается адрес, если успех. Иначе - NULL.
Функция strpbrk предназначена для поиска первого символа исходной строки, которой совпадает с одним из символов ключевой строки.
Функция strstr обеспечивает поиск первого вхождения в исходную строку последовательности символов ключевой строки без учёта ' \0 ' .
6. Функция лексиграфического разбора.
char* strtok ( char* str, char* delimit ) ;
- рассматриваем исходную строку символов по адресу str как набор лексем, которые разделены в ней промежутками из одного или нескольких строки ограничителей, адресованной указателем delimit.
В приведенной транскрипции функция strtok выполняет поиск первой лексемы исходной строки символов. Поиск остальных лексем гарантирует последовательность вызовов функции strtok , в которых адрес исходной строки заменяет нулевой указатель NULL, а строки ограничителей необязательно идентичны.
Пример :
char* nom ;
char* denom ;
char fraction[ ] = " 1 / 100 " ;
nom = strtok ( fraction, " / " ) ;
denom = strtok ( NULL , " / " ) ;
puts(nom) ; // Результат : 1
puts(denom) ; // Результат : 100
#include<string.h>
int main ( int argc, char* argv[ ] ) // argc - число элементов командной строки
{ // argv[ ] - массив указателей на слова командной строки
char* p ; // Адрес записи текущего двоичного числа.
char* m = 0 ; // Адрес записи максимального двоичного числа.
int i = 0 ; // Индекс текущего элемента.
int n = 0 ; // Номер максимального двоичного числа.
while ( ++i < argc )
{
if ( strspn ( argv[ i ] , "01" ) != strlen ( argv[ i ] )
continue;
if ( ( p=strchr ( argv[ i ], '1' ) ) == NULL )
continue;
if ( strcmp( m, p ) > 0 )
continue;
m = p ; n = i ;
}
return(n);
}
Запуск :
$ a.out file.txt 3
argv[0] содержит адрес на a.out
argv[1] - на file.txt
argv[2] - "3"
Задание :
Проверить результат работы с аргументами 1000 1111 .