Функции для работы со строками.

Для работы со строками в языке С есть специальные функции, которые описаны в библиотечном файле string.h. Наиболее часто используются следующие функции.

1.strlen(s) - определяет длину строки и возвращает количество символов без нулевого символа.

k =strlen(s)

2. strcat(s1,s2)- производит соединение двух строковых переменных s1 и s2, при этом s2 присоединяется в конец s1.

char str1 [10 ]=” adcdef”;

*str2 = “nijk”;

strcat(str1,str2); str1 =”abcdefnijk”

3.strncat (s1,s2, n) – соединяет n литер из строки s2 с s1.

4.strcmp (s1,s2)- производит сравнение двух строк s1 и s2. При сравнении происходит посимвольное вычитание кодов символов. Сравнение выполняется до первого появления неравных символов.

strcmp(“AAA”,”AAA”) 0

strcmp(“AAB”,”AAA”) 1

strcmp(“AAA”,”AAB”) -1

5. strncmp(s1,s2,n)- производит сравнение n начальных символов двух строк s1 и s2.

6.strcpy(s1,s2)- выполняет копирование строки s2 в строку s1 и возвращает строку s1.

7.strncpy(s1,s2,n) - выполняет копирование n символов строки s2 в строку s1 и возвращает строку s1.

8.strchr (s,с) - возвращает указатель на первый встреченный в строке s символ с. Если такого символа в строке не оказалось, возвращает NULL.

9.strrchr (s,c) - возвращает указатель на последний встреченный в строке s символ с.

10.strstr(s1,s2) возвращает указатель на первое вхождение s2 в s1.

11.strtok(s1, z)- разбивает строку на отдельные лексемы, разделенные знаками строки z.

Пример 7.1 В качестве примера рассмотрим несколько простых задач по обработке строковых данных. Одна из строковых переменных описана как массив символов (char t[160]), а вторая с помощью указателя на символьный тип как строку (char *tt). При решении задач используется индексное обращение к каждому символу строки.

void main()

{int i,j,l,n=0;

char t[160]="фірма виконує ремонт комп'ютерів";

char *tt="усі аудіторії у цей час зайняті";

/*1*/Порахувати кількість букв м

l=strlen(t);

for(i=0;i<l;i++)

if( t[i]=='м') n++;

printf("%d\n",n);

 

/*2*/Замінити м на +

for(i=0;i<l;i++)

if( t[i]=='м') t[i]='+';

printf("%s\n",t);

 

/*3*/Уставити перед м +

for(i=0;i<=l;i++)

if( t[i]=='м')

{for(j=l;j>i;j--)

t[j]=t[j-1];

t[i]='+';i=i+1;}

puts(t);

 

/*4*/Порахувати кількість букв м

n=0; for(i=0;i<l;i++)

if( *(tt+i)=='м') n++;

printf("%d\n",n);

 

/*5*/Видалити м

l=strlen(tt);

for(i=l-1;i>=0;i--)

{if( *(tt+i)=='м')

{for(j=i;j<l-1;j++)

*(tt+j)=*(tt+j+1);}};

puts(tt);

Пример 7.2 Задана строка. Предполагается, что в ней могут быть подряд идущие одинаковые символы. Удалить их, оставив по одному из таких символов.

void main()

{

int i,n=0,j,k,l;

char f[30];

printf("Введите строку ");

gets(f); \\Ввод строки

printf("%s",f); \\вывод исходной строки на экран

l=strlen(f);\\ определение длины сроки

for(j=l-1;j>=0;j--)

if( f[j]==f[j+1])\\ сравнение двух соседних символов

{

n++;\\подсчет количества удаленных символов

for(k=j; k<l-1;k++) f[k]=f[k+1];\\удаление символа

}

i=l-n;

f[i]='\0';\\завершение строки

printf("\nn=%d \nstr=%s",n,f);

}

 

Пример 7.3 Задана строка. Найти самое длинное слово и заменить его *.

void main()

{

int i,l,ksl,nsl,max=0,dlsl, nmax,kmax;

char *a="текст исходной строки";

printf("исходная строка= %s\n",a);

nsl=0;

l=strlen(a);

for( i=0; i<l; i++)

if (a[i]==' ')

{

ksl=i-1; dlsl=ksl-nsl+1;

if (dlsl>max) {max=dlsl;nmax=nsl; kmax=ksl;}

nsl=i+1;

}

printf("нач_символ= %d кон_символ=%d длина=%d\n",

nmax, kmax,max);

printf("\слово= ");

for(i=nmax; i<=kmax; i++) printf("%c",a[i]);

for(i=nmax; i<=kmax; i++) a[i]='*';

printf("\n результирующая строка= %s\n",a);

getch();

}

 

Пример 7.3 Задана строка. Определить количество пробелов.

void main()

{

int n=0;

char *b="программа не должна содержать ошибок";

char *p;\\дополнительный указатель

p=b; \\p указывает на туже строку, что и b

p=strchr(p,' ');\\определение положения первого пробела

while(p)\\ цикл до конца строки

{

p++;\\ смещение указателя на одну позицию

n++;\\подсчет количества пробелов

p=strchr(p,' ');

}

printf(" \n\nn= %d \n",n);

}

 

Пример7.4 Задана строка. Предполагается, что в ней слова могут быть разделены пробелами, запятыми или точками. Разбить текст на слова и пронумеровать слова.

int main(void)

{

char *input="Весна. Солнце греет, временами дождь.";

char *p;//дополнительный указатель

char *z=" ,.";//строка с возможными разделителями

int k=1;

p = strtok(input, z);//выделение первого слова

if (p) printf("%d %s\n",k, p);

do// цикл до конца строки

{

p = strtok(NULL, z);// выделение очередного слова

if (p)

{ k++; printf("%d %s\n",k, p);}

}

while(p);

getch();

}