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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



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

РАБОТА С ФАЙЛАМИ ДАННЫХ

Этапы использования файлов

ü Описание указателя на файл.

ü Открытие файла.

ü Чтение или запись данных.

ü Закрытие файла.

ü Вспомогательные действия: проверка конца файла, проверка наличия ошибки и т.п.

Описание указателя на файл.

Производится обязательно до открытия файла.

FILE *pf1, *pf2,…;

stdio.h 

Например  FILE * fin, * fout;

 

Открытие файла

pf = fopen (“имя файла”,”режим”);

где

pf - описанный ранее указатель на файл;

fopen - функция открытия файла;

“имя файла” -   “post.dat”, “ c:\work\sap.dat”

”режим”

       “r” – открытие файла для чтения;

       “w” – для записи;

       “a” – для дозаписи;

       “+” – добавка      “r+” – чтение с последующей записью;

       “b” – добавка к основному режиму, указывает, что файл содержит

Например 

fin = fopen(“form.txt”,” r”);

fout = fopen (“rez.dat”,”w”);

Запись/чтение данных.

Запись данных в файл

fprintf(pf,“управляющая строка”,”список вывода”);  

Например 

fprintf(fin, “%4d %6.2f \n”, k,p);

Чтение данных из файла

fscanf(pf,“управляющая строка”,”список адресов”);

Например 

fscanf(fin,“ %f %f %d”, &q, &t, &m);

Закрытие файла.

fclose(указатель файла);

Например 

fclose(fin);

 

Пример 8.1

Занести в файл 10 целых чисел. Затем считать числа из файла и вывести на экран.

int main()

{

int i, kol;

int a;

FILE *pf_1;

 

//Занесение информации в файл

pf_1 = fopen("ff1.dat", "w");

printf("введите количество элементов");

scanf("%d",&kol);

printf("введите данные");

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

{

scanf("%d",&a);

fprintf(pf_1,"\n%d",a);

}

fclose(pf_1);

}

 

,

 

 

 

 

                                 
                                 
                                 
                                 
                                 

 

 

 

                                 
                                 
                                 
                                 
                                 

 

 

 

                                 
                                 
                                 
                                 
                                 

 



//Считывание информации из файла

 

pf_1 = fopen("ff1.dat", "r");

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

{

fscanf(pf_1,"%d",&a);

printf(" %4d",a);}

fclose(pf_1);

return 0;

}

 


Проверка конца файла.

feof(указатель файла)      признак

Если признак = =0, то конец файла не достигнут.

Если признак ≠ 0, то достигнут конец файла(eof):  

while(! feof (fin))

{

...

}
Пример 8.2. Занести в файл числа, сформированные с помощью rand(). Перенести положительные числа в другой файл.

Посчитать сумму чисел во втором файле.

Вывести на печать данные из второго файла.

int main()

 {

FILE *pf_1, *pf_2;

int i,s=0, a, kol=8;

 

pf_1 = fopen("ff1.dat", "w");

 

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

{

a=-50+random(100);

printf("%5d",a);

fprintf(pf_1,"\n%d",a);

}

fclose(pf_1);

///////////////////////////////////

pf_1 = fopen("ff1.dat", "r");

pf_2 = fopen("ff2.dat", "w");

 

 while (!feof(pf_1))

 {

  fscanf(pf_1,"%d",&a);

 printf("%5d",a);

 

 if(a>0) fprintf(pf_2,"\n%d",a);

}

fclose(pf_1);

fclose(pf_2);

/////////////////////////////////////

pf_2 = fopen("ff2.dat", "r");

printf("\n ");

while (!feof(pf_2))

 {

 fscanf(pf_2,"%d",&a);

 printf(" %4d ", a);

 s=s+a;

 }

printf("\n summa= %5d",s);

fclose(pf_2);

return 0;

}

8.7.Проверка наличия ошибки.

Используется функция   ferror(указатель файла)     признак

Если признак = =0 - нет ошибки

Если признак!= 0 - есть ошибка.

Пример:

int error;

if((error = ferror(fout))!=0)

printf(“Ошибка при работе с файлом типа %d ”, error);

    

8.8 Установка указателя файла на заданное смещение

fseek(указатель на файл, offset, origin);

 

origin SEEK_SET  - Поиск с начала файл

               SEEK_CUR  - Поиск с текущей позиции

               SEEK_END  - Поиск с конца файла

 

8.9. Определение положения указателя файла



Поделиться:


Последнее изменение этой страницы: 2021-04-04; просмотров: 53; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.175.180 (0.099 с.)