Для работы со строками в языке С есть специальные функции, которые описаны в библиотечном файле 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). Преобразовать в строковые переменные элементы массива и их индексы. Вывести на печать строковые переменные.
|