Найти все слова, содержащие заданную подстроку - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Задача: найти все слова, содержащие заданную подстроку, и вывести.. Эта программа работает. Однако имеется небольшая (а может и большая) косость - я работаю с глобальным A[]. Как передать указатель на него в функцию, объявив массив в Main? Заранее спасибо.
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
 
char A[6][80],s[80],f[80];
int i,j,a=0,max=0,c=0;
 
void Find(int iStart,int iEnd,int iLine)
{
    char *p=&A[iLine][iStart];
    memset(f, 0, sizeof(f));  
    strncpy(f,p,iEnd-iStart);
    if(strstr(f,s)!=0)
        printf("%s\n",f);
}
 
int main()
{
    printf("Enter number of strings: ");
    scanf("%d",&c);
    printf("Enter word: ");
    scanf("%s",s);
    for(i=0;i<c;i++)
    {
        printf("Enter %d string (max 80): ",i+1);
        getchar();
        gets(A[i]);
    }
    for(i=0;i<c;i++)
    {
        a=0;
        for(j=1;j<80;j++)
        {
            if(A[i][j]==' ')
            {
                Find(a,j,i);
                a=j+1;
            }
            if(A[i][j]=='\0')
            {
                Find(a,j,i);
                break;
            }
        }
    }
    getch();
}
Подскажите пожалуйста

Решение задачи: «Найти все слова, содержащие заданную подстроку»

textual
Листинг программы
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
 
//void Find(int iStart, int iEnd, int iLine)
void Find(char* p, unsigned length, char* f, char* s)
{
    //char* p = &A[iLine][iStart];
    //memset(f, 0, sizeof(f));
    //strncpy(f,p,iEnd-iStart);
    strncpy(f, p, length);
    f[length] = '\0';
 
    if (strstr(f, s) != 0)
    {
        printf("%s\n", f);
    }
}
 
int main()
{
    char A[6][80], s[80], f[80];
    int i, j, a = 0, c = 0;
 
    printf("Enter number of strings: ");
    scanf("%d", &c);
    printf("Enter word: ");
    scanf("%s", s);
    for (i = 0; i < c; i++)
    {
        printf("Enter %d string (max 80): ", i + 1);
        getchar();
        gets(A[i]);
    }
    for (i = 0; i < c; i++)
    {
        a = 0;
        for (j = 1; j < 80; j++)
        {
            if (A[i][j] == ' ')
            {
                //Find(a, j, i);
                Find(&A[i][a], j-a, f, s);
 
                a = j + 1;
            }
            if (A[i][j] == '\0')
            {
                //Find(a, j, i);
                Find(&A[i][a], j-a, f, s);
 
                break;
            }
        }
    }
    getch();
 
    return 0;
}

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы: , , , , .
  2. Определяется функция Find, которая принимает три аргумента: int iStart, int iEnd, char* p.
  3. Внутри функции Find выполняется следующее: a. char* p = &A[iLine][iStart]; - инициализируется указатель p на строку в массиве A с заданными индексами iLine и iStart. b. memset(f, 0, sizeof(f)); - буфер f очищается нулями. c. strncpy(f,p,iEnd-iStart); - в буфер f копируется подстрока из p длиной iEnd-iStart. d. f[length] = '\0'; - в конец строки в буфере f добавляется нулевой символ. e. Если подстрока содержит заданную подстроку s, то выводится на экран содержимое буфера f.
  4. В функции main объявляются переменные: char A[6][80], s[80], f[80];, int i, j, a = 0, c = 0;.
  5. Пользователю предлагается ввести количество строк и слово для поиска.
  6. В цикле происходит ввод строк с помощью функции gets(A[i]).
  7. В цикле происходит поиск подстрок, содержащих заданное слово, в каждой строке массива A.
  8. Если подстрока найдена, то вызывается функция Find, передавая ей указатель на начало подстроки, длину подстроки и указатель на буфер, в который будет скопирована найденная подстрока.
  9. После завершения поиска выводится сообщение об успешном завершении программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5
Похожие ответы