При запуске программы пользователь вводит две строки, длины которых ограничены 1024. Вывести индексы всех вхождений второй строки в первую, используя Прямой алгоритм.
Не могу понять как это впринципе осуществляется. Сам порядок решения. Подскажите, пожалуйста.
l= strlen(c2);
i= 0;
while (c1[i]>0) {
j= 0;
while ((c2[j]>0) && (c2[j]==c1[i+j])) j++;
if (j=l) printf("%d\n",i++);
}
Я бы, наверное, сделал вот так:
char *pc1 = c1;
while(*pc1++)
{
char *p = pc1;
char *pc2 = c2;
while((*p != 0) && (*pc2 != 0) && (*p++ == *pc2++));
if(!(*pc2)) printf("%d\n", (pc1 - c1));
}
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char c1[]="mamapopmamakjhmama";
char c2[]="mama";
char *pc1=c1;
while(*pc1++)
{
char *p = pc1;
char *pc2 = c2;
while((*p != 0) && (*pc2 != 0) && (*p++ == *pc2++));
if(!(*pc2)) printf("%d\n", (pc1 - c1));
}
getch();
return 0;
}
Говорила мне мама - не пиши на С, проблемы на пустом месте возникают. pc1 надо увеличивать в другом месте:
while(*pc1), тогда должно сработать. Проверь, у меня сейчас компилятора С-шного под рукой нет...
{
char *p = pc1;
char *pc2 = c2;
while((*p != 0) && (*pc2 != 0) && (*p++ == *pc2++));
if(!(*pc2)) printf("%d\n", (pc1 - c1));
pc1++; /* <--- Вот тут */
}
char *p = pc1; // начинаем просмотр с текущего места основной строки
char *pc2 = c2; // и с начала подстроки
// пока не дошли до конца строки и не дошли до конца подстроки,
// и очередные символы равны между собой - продвигаемся в обеих
// строках дальше
while((*p != 0) && (*pc2 != 0) && (*p++ == *pc2++));
Огромное спасибо!!! Всё поняла, во всём разобралась.
Приношу запоздалые извинения за свои ляпы. Все же коды надо проверять..
Вот рабочий вариант (чисто для порядку)):
int l= strlen(c2);
int i= 0;
while (c1[i]>0) {
int j= 0;
while ((c2[j]>0) && (c1[i]>0) && (c2[j]==c1[i+j])) j++;
if (j==l) printf("%d\n",i);
i++;
}