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

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

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

 Например: k =strlen(s);

 

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

Например:  

char str1 [10 ]=”весна ”;

*str2 = “лето”;

strcat(str1,str2);     str1 =весна лето

 

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

 

4. int strcmp(char *sl, char *s2)

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

Возвращает в качестве результата сравнения целую величину:

< 0 когда sl меньше, чем s2;

= 0 когда sl равна s2;

> 0 когда sl больше, чем s2.

Например:

 strcmp(“AAA”,”AAA”)           0

 strcmp(“AAB”,”AAA”)           1

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

Например:

int n;

char s[]="abc";

char *tt="abf";

n=strcmp(s,tt);

printf(" %d",n);      n    -3

 

 

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

 

6. int stricmp (char *sl, char *s2) - выполняет сравнение двух строк, не учитывая регистра символов.

 

7.int strnicmp (char*sl, char*s2, size_t n)- сравнивает первые n символов строк sl и s2, не делая различия в регистре символов.

 

8. char* strrev (char *str)-обращает порядок символов в строке str

Например:

char str[] = "март";

strrev(str);

 

     str    "трам"

 

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

Пример

char s[]="баркас";

char *tt;

strcpy(tt,s);

printf("%s",tt);         

             tt    баркас

 

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

 

11.char* strchr (char *str, int c)- находит первое вхождение символа  c в строку str и возвращает указатель на первый встреченный в строке символ c. Если такого символа в строке не оказалось, возвращает NULL.

Например:

char *tt="аудитория 8.712";

char *p;

p=strchr(tt,'8');

printf(" \n %u ", p);          

 

                                пусть адрес tt - …150

                                                    p - …160

 

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

 

13. char* strstr (char*str, char*s)- ищет в строке str первое вхождение подстроки s и возвращает указатель на первый символ найденной в строке str подстроки s.

Если строка s не обнаружена в строке str, функция возвращает NULL.

Например:

char *tt="abc def ijk lmn";

char *p;

p=strstr(tt,"def");

printf(" \n tt= %u p= %u ",tt, p);

адрес tt = … 170

p = … 174

14.char* strpbrk (char* str, char *pat)- просматривает строку и определяет первое вхождение любого символа из образца, т.е. ищет в строке str первое вхождение любого символа из образца pat. Если символы из образца не содержатся в строке, функция возвращает NULL.

Например:

void main()

{

char *a="abc1234.,";

char *p="bd1";

char *rez;

printf(" \na=%d ",a);

printf(" \np=%d ",p);

rez=strpbrk(a,p);

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

}

адрес a=…170

адрес p=…180

адрес rez=…171

 

15. char* strtok (char* s1, char* 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();

}

 

Пример 7.5 Заданы элементы массива действительных чисел (в примере их 3). Преобразовать в строковые переменные элементы массива и их индексы. Вывести на печать строковые переменные.
void main(){int i; float a[]={4.5,5.34,6.78};char strd[10],strf[10]; for(i=0;i<3; i++){sprintf(strd,"%2d ",i);sprintf(strf," %5.2f",a[i]);printf("\n%s %s ",strd,strf);}}  


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: