Хелпикс

Главная

Контакты

Случайная статья





Функции работы со строками.. Примеры программ



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

Ниже приведены объявления и рассматриваются примеры наиболее часто используемых функций работы со строками [3,10,11]. А также рассматриваются примеры программ реализации некоторых из этих функций.

Требуется отметить, что прототипы нижеприведенных функций располагаются в заголовочном файле <string.h>.

 

 size_t strlen (const char *s) – возвращает длину в байтах строки s, не включая '\0'.

 char * strcat (char *dest, const char *src) – присоединяет строку src, в конец строки dest.

 char * strcpy (char *dest, const char *src) – копирует строку src в место памяти, на которое указывает dest.

 char * strncat (char *dest, const char *src, size_t maxlen) – присоединяет maxlen символов строки src в конец строки dest.

 char * strncpy (char *dest, const char *src, size_t maxlen) – копирует msxlen первых символов строки src в место памяти, на которое указывает dest.

 char * strstr (char *s1, const char *s2) – отыскивает первое вхождение строки s2 в строку s1.

 int strcmp (const char *s1, const char *s2) – сравнивает две строки в лексикографическом порядке с учетом различия прописных и строчных букв. Возвращает значение меньше 0, если s1 располагается в упорядоченном по алфавиту порядке раньше, чем s2, и больше, если наоборот. Функция возвращает нуль, если строки идентичны.

 char * stricmp (const char *s1, const char *s2) – аналогична strcmp, только не различает прописные и строчные буквы.

Примеры программ

Пример. Удалить из строки символов подстроку заключенную в [ ].

 

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

void main()

{ char *ss;

int i,j,k,n;

scanf("%d",&k);

ss=(char *)malloc(k);

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

fflush(stdin); // чистка входного буффера

gets(ss);

printf("\nИсходная строка символов : %s",ss);

 

 

 j=-1;                           // позиция открывающей скобки '[' в строке

for(i=0;*(ss+i);i++)          // цикл прохода по строке до ее конца

{ if (*(ss+i)=='[')          // скобка найдена

  { j=i;

    while(*(ss+ ++j)!=']' && *(ss+j)!='[' && *(ss+j));

   if (*(ss+j)=='[') i=j-1; // позиция вложенной скобки [ (теперь

                                         // основной)

                                  // во внешнем цикле по i увеличится значние i

    else if(*(ss+j++)==']') // позиция закрывающей скобки

      { n=i;

        

 

 

 while(1)

if(!(*(ss+n++)=*(ss+j++))) break; //сжатие строки (удаление

                                                  // подстроки)

i--;    // после сжатия надо проверить первый из символов

                       // сдвинутых на [...] не является ли он сам [

    }

}

}

printf("\nCжатая строка символов : %s",ss);

}

 

Пример. Ввести символьную строку и выполнить в ней удаление предпоследнего слова. Слова в строке разделены одним пробелом.

 

#include <stdio.h>

#include <stdlib.h>

main()

{ int kk,k,n;

char *s;

puts("введите длину строки ");

scanf("%d",&n);

s=(char*)malloc(n);

if(!s) return 0; // ошибка выделения памяти

fflush(stdin);  // чистка входного потока

puts("введите строку: ");

gets(s);

puts("исходная строка: ");

puts(s);

k=0;

while(*(s+k)) k++; // переход в конец строки. k – позиция ‘\0’

while(*(s+k)!=' ') k--; // позиция пробела перед последним словом

kk=k--;            // запоминаем в kk позицию пробела и сдвиг на

                           // последний символ предпоследнего слова в строке

while(*(s+k)!=' ') k--; // позиция пробела перед предпоследним словом

while(*(s+ ++k)=*(s+ ++kk)); // удаление предпоследнего слова (запи-

                                                  // сываем на его место последнее слово)

puts("преобразованная строка: ");

puts(s);

}

 

Пример. Ввести символьную строку и выполнить в ней замену местами последнего и предпоследнего слов.

 

#include <stdio.h>

#include <stdlib.h>

main()

{  int kk,k,n;

   char *s,*s1,t;

 scanf("%d",&n);

s=(char*)malloc(n);         // выделение памяти без инициализации

   s1=(char*)calloc(n,1);     // выделение памяти с инициализацией

 if(!s||!s1) return 0;

   fflush(stdin);

 gets(s);

 k=0;

 while(*(s+k)) k++;  // переход в конец строки. k – позиция ‘\0’     

 while(*(s+k)!=' ') k--; // позиция пробела перед последним словом

 k--;

 while(*(s+k)!=' ') k--; // позиция пробела перед предпоследним словом

 kk=++k;            // запоминаем позицию первого символа этого слова

 n=0;                  // перезапись в строку s1 предпоследнего слова

while(*(s+k)!=' ') *(s1+n++)=*(s+k++);

k++;                  // запись последнего слова на предпоследнее

   while(*(s+k)) *(s+kk++)=*(s+k++);

 *(s+kk++)=' ';  // вставка пробела после слова

n=0;                  // дозапись слова из строки s1 

   while(*(s+kk++)=*(s1+n++));

 printf("%s",s);

 free(s);  free(s1); // освобождение памяти

}

 

Пример. Рассмотрим еще один пример программы замены двух соседних слов в строке без использования дополнительных строк. Пусть например необходимо выполнить местами первого и второго слов.

 

#include<stdio.h>

#include<stdlib.h>

void main()

{ char *str,c;

int i,i1,i2,j,j1,j2,n;

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

scanf("%d",n);

printf("\nвведите строку символов ");

if ((str=(char *)malloc(n))==NULL)

{puts("нет свободной памяти"); return;}

fflush(stdin); // чистка входного буффера

gets(str);

printf("\nИсходная строка   : %s",str);

i=0;

while(*(str+i)==' ') i++; // пропуск пробелов вначале строки

i1=i;                // начало первого слова

while(*(str+i)!=' ') i++;

i2=i-1;              // конец первого слова

while(*(str+i)==' ') i++; // пропуск пробелов вначале строки

j1=i;                // начало второго слова

while(*(str+i)!=' ') i++;

j2=i-1;              // конец второго слова

 

for(i=0;i<i2-i1+1;i++) // замена первого слова и

*(str+j1-1-i)=*(str+i2-i);

for(i=0;i<j1-i2-1;i++) // пробелов за ним местами

*(str+i1+i)=' ';

 

for(j=i1;j<j1;j++)      // число повторов циклического сдвига

{ c=*(str+i1);         // запоминаем символ i1 позиции

for(i=0;i<j2-1;i++)  // сдвиг на 1 позицию влево

*(str+i1+i)=*(str+i1+i+1);

*(str+j2)=c;         // перенос символа в позицию j2

}

printf("\nПреобразованная строка : %s",str);

}

 

Пример. Создать массив указателей на слова для каждой вводимой строки. Строка может содержать до 10 слов. Используя массив указателей исключить из каждой строки cлово с максимальной длинной.

 

#include <stdio.h>

#include <stdlib.h>

#define size 2

void fff(char *,char *);

void main()

{ char *st[size][10],*mst,*pst;

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

n=0;

do

{ st[n][0]=(char *)malloc(20); // выделение памяти под строку

gets(st[n][0]);                   // ввод строки

} while(*st[n++][0]);              

n--;

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

{ k=0;

for(j=0; *(st[i][0]+j); j++)

if(*(st[i][0]+j)==' ')        // найден пробел - конец слова

      st[i][++k]=st[i][0]+j+1; // адрес начала слова

st[i][++k]=st[i][0]+j+1;      // адрес ’\0’ (для последнего слова)

for(; k<9; )

st[i][++k]=NULL;      // остальные адреса для слов в строке

}

for(i=0; i<n; i++)          // перебор строк

for(j=0; st[i][j]; j++)     // перебор слов в строке

fff(st[i][j],st[i][j+1]);    // сравнение 2 слов для поиска max

 

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

puts(st[i][0]);

}

 

void fff(char *st1,char *st2)

{ int i;

static j;

static char *k;

j=(st2-st1>j) ? k=st1,j=st2-st1 : j;

              // j - длина максимального слова

              // k - указатель на начало этого слова

if (!st2)    // передано не одно слово

{ for(; j>0; j--)

  { for(i=0; *(k+i+1); i++)

    *(k+i)=*(k+i+1); // сдвиг строки на позицию max слова

    *(k+i)='\0';

  }

}

}

 

Пример. Ввести символьную строку и найти в ней слово максимальной длины.

 

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

main()     

{ char *st;

        int i,k,kk=0,i1,i2,i3,size;

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

scanf("%d",&size);

st=(char *)malloc(size);

fflush(stdin);

gets(st);    

 

 

 

 i=i1=i2=0;

while(*(st+i))

{ i3=i;                                       // индекс начала слова в строке

  for(k=0; *(st+i)!=' ' && *(st+i); i++,k++);

  if(kk<k) { kk=k; i1=i3; i2=i; } // координаты max слова

if(*(st+i)==' ') while(*(st+(++i))==' '); //удаление повторных      //пробелов

}

puts("\nслово max длины ");

for(i=i1; i<i2; printf("%c",*(st+i++)));

 }

 

Пример  . Ввести строку и выполнить в ней замену слова с минимальной и максимальной длинной.

 

#include<stdio.h>

#include<conio.h>

#include<stdlib.h>

main()

{ char c,*s,*s1,*s2;

int i,n,nn,min,max,i1,i2,l,i3,i4;

clrscr();

puts("");

scanf("%d",&nn);

s=(char*)malloc(nn);

s1=(char*)calloc(nn,1);

s2=(char*)calloc(nn,1);

if(!s||!s1||!s2) return 0;

fflush(stdin);

gets(s);

i=i1=i2=0;

min=nn; max=0;

while(*(s+i))

{ for(n=0;*(s+i)!=' ' && *(s+i); i++,n++);

if(max<n) { max=n; i1=i-n; }

if(min>n) { min=n; i3=i-n; }

 

if(*(s+i)==' ')

while(*(s+(++i))==' ');

}

l=0; i=i1;

while(*(s+i)!=' ' && *(s+i)) *(s1+l++)=*(s+i++);

 

l=0; i=i3;

while(*(s+i)!=' ' && *(s+i)) *(s2+l++)=*(s+i++);

 

l=0;

if(i1<i3)

{ i2=i1+max;

while(*(s2+l)) *(s+i1++)=*(s2+l++);

while(i2<i3) *(s+i1++)=*(s+i2++);

l=0;

while(*(s1+l)) *(s+i1++)=*(s1+l++);

}

else

{ i=i1+max-min;

while(*(s2+l)) *(s+i++)=*(s2+l++);

i2=i-min-1; i1--;

while(i1>=i3+min)

*(s+i2--)=*(s+i1--);

l=0;

while(*(s1+l)) *(s+i3++)=*(s1+l++);

}

puts(s);

free(s);

free(s1);

free(s2);

}

Пример  . Ввести строки. Определить, какие строки из введенных читаются одинаково из начала в конец и наоборот

 

#include <stdio.h>

#include <conio.h>

void main()

{ char mas[20][20];

int i,n,length,j;

clrscr();

printf("Сколько строк вы хотите ввести: ");

scanf("%d",&n);

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

{ fflush(stdin); gets(mas[i]); } // ввод n строк

printf("\n\n");

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

{ length=0; j=0;

  while (mas[i][j])

  { length++; j++; } // подсчитываем длину i строки

  for (j=0;j<length/2;j++) // проверяем необходимое условие

  if (mas[i][j]!=mas[i][length-1-j]) break;

  if (mas[i][j]==mas[i][length-1-j]) puts(mas[i]); // найдена

                                                                             // искомая строка

}

}

 

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.