Для работы со строками в языке С есть специальные функции, которые описаны в библиотечном файле 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();
}