Найти все слова, содержащие заданную подстроку - 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;
}
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы:
, , , , . - Определяется функция
Find, которая принимает три аргумента:int iStart, int iEnd, char* p. - Внутри функции
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. - В функции
mainобъявляются переменные:char A[6][80], s[80], f[80];,int i, j, a = 0, c = 0;. - Пользователю предлагается ввести количество строк и слово для поиска.
- В цикле происходит ввод строк с помощью функции
gets(A[i]). - В цикле происходит поиск подстрок, содержащих заданное слово, в каждой строке массива
A. - Если подстрока найдена, то вызывается функция
Find, передавая ей указатель на начало подстроки, длину подстроки и указатель на буфер, в который будет скопирована найденная подстрока. - После завершения поиска выводится сообщение об успешном завершении программы.