Процедурное программирование на языке С. Часть 2. Указатели на объекты. Многоуровневая адресация: Методические указания к лабораторным работам по курсам «Алгоритмические языки и программирование» и «Процедурное программирование», страница 21

         for(i=0;i<n;i++) /* Поиск символов строки из  диапазона */

            for(p='k'; p<='t'; p++)

                 if(st[i] == p)

                {   uk=(char*)realloc(uk,(k+1)*sizeof(char));   uk[k]=st[i];

strupr(uk);                 k++;

                 }                              

         for(i=0;i<k-1;i++)    /* Упорядочивание адресов  букв в соответствии с алфавитным порядком букв  */

for(j=i+1;j<k;j++)

          if(((int)uk[i])>((int)uk[j])) { help=uk[i];  uk[i]=uk[j];  uk[j]=help; }

   printf("\n Result :\n");

                           for(i=0;i<k;i++)    printf(" %c",uk[i]);       free(uk);                 free(st);

}

Поиск символов в строке осуществляется с использованием функций strchr(), strrchr(), strstr(), strpbrk().

Функция char * strchr(constchar * str, intsim) определяет первое местоположение символа sim в строке с адресом str. Возвращаемым значением является адрес, по которому символ sim обнаружен при поиске в данной строке, начиная с адреса str, или NULL, если символ отсутствует. Нулевой символ, завершающий строку, также входит в число проверяемых символов.

Аналогично функция char * strrchr(constchar * str, intsim) определяет адрес последнего вхождения символа sim в строку с адресом str.

Функция char * strstr (constchar * str_1, constchar * str_2) определяет первое вхождение строки с адресом str_2 в строку с адресом str_1. Возвращаемым значением является адрес, по которому первый символ строки с адресом str_2 записан  в строке с адресом str_1.  Возвращаемым значением является  NULL, если вторая строка не встречается в первой.

Функция char * strpbrk(constchar * str_1, constchar * str_2) определяет первое вхождение любого символа из строки с адресом str_2 в строку с адресом str_1. Возвращаемым значением является адрес, по которому указанный символ  обнаружен при поиске в строке, начиная с ее адреса.  Если ни один символ второй строки не встречается в первой, функция возвращает NULL. После выполнения фрагмента программы

сhar * ptr; ptr = strpbrk(“Это тест!”, “есою”);  printf(“%s”,ptr);  –

на экране появятся символы: “о тест!”.

Любая из функций strchr(), strrchr(), strstr(), strpbrk() при одном вызове обнаружит только одно вхождение заданного символа (заданной строки) в анализируемую строку. Если ставится задача обнаружения всех вхождений, то необходимы многократные вызовы соответствующих функций. При этом следует «продвигать» указатель на следующую позицию с целью избежания зацикливания программы.


КОНТРОЛЬНЫЕ ВОПРОСЫ И ЗАДАНИЯ

1. Переписать программу из примера 6.1 с использованием функций scanf(), gets(), getchar(), getc(), getch() вместо функции getche().

2. С использованием функции realloc() ввести с клавиатуры несколько строк, с одновременным выделением памяти для очередной строки.

3. Какие из операторов могут быть написаны синтаксически верно и в каких случаях?    Как должны быть объявлены (и инициализированы) соответствующие переменные ?

K = strlen(ptr[j]);

L = atoi(St);

strstr(S+j,F);

4. Что будет на экране после выполнения программы                 

#include <stdio.h>

#include <string.h>

void main (void)

 {char str1[] = "asdfFSSFKhg", str2[]="AEF", * ptr;

ptr=strupr(str1);

 while ((ptr = strpbrk(ptr,str2))!=NULL)

  {printf("\n %c - %d",*ptr,(int)(ptr-str1));

ptr++;  

       }

 }

5. Что будет на экране после выполнения программы?                 

Найти и исправить  некорректность в программе.

#include <stdio.h>

#include <string.h>

char * fun (int * j,  char *D , char  g)

{ if (g=='d')

  {*++D='a'; printf ("\nfun:D = %s", D++); return D;}   

   g= 'T'; *(++D + 4+ (++(*j))) = 'V';   return D;

}

void main (void)

   {char tt[]={'d','h','f','k','l'}, s[]="comprehension";

 char * g=s, *h=tt; int  i=0;

 for (; *g;  i=strlen(g),i++) *++h=*g++;