Zdravim, pokusil jsem se narychlo funkci applyRules() upravit do korektni podoby a vysledek vypada nasledovne (kontrolni vypisy jsou zakomentovane):
//-----------------------------------------------------------------------------
// Aplikace prepisovacich pravidel na retezec
//-----------------------------------------------------------------------------
void applyRules(
char *rules[], // pole prepisovacich pravidel
char *axiom, // axiom - prvotni naplneni retezce
char *ret, // retezec, do ktereho se ma ulozit vysledek
int maxiters) // maximalni pocet iteraci (aplikaci pravidel)
{
int rulesCount; // pocet pravidel
char *leftSide; // pole levych casti prepisovacich pravidel
char **rightSideSrc; // pole pravych casti prepisovacich pravidel
int i, j, k, iter; // pocitadla smycek a indexy znaku
char src[MAX_LENGTH];
// zjistit celkovy pocet prepisovacich pravidel
for (rulesCount=0; rules[rulesCount]; rulesCount++)
;
// nyni mame v promenne rulesCount ulozen pocet prepisovacich pravidel
printf("celkovy pocet pravidel=%d\n", rulesCount);
// alokace pameti pro levou stranu prepisovacich pravidel
// a inicializace pole znaku
leftSide=(char *)malloc(rulesCount*sizeof(char));
for (i=0; i<rulesCount; i++)
leftSide[i]=rules[i][0];
// alokace pameti pro pravou stranu prepisovacich pravidel
// a inicializace pravych stran
rightSideSrc=(char **)malloc(rulesCount*sizeof(char *));
for (i=0; i<rulesCount; i++) {
rightSideSrc[i]=(char *)malloc(MAX_LENGTH);
strcpy(rightSideSrc[i], rules[i]+2); // podretezec za znakem '='
}
// nastaveni axiomu
strcpy(ret, axiom);
// hlavni iteracni smycka
for (iter=0; iter<=maxiters; iter++) {
j=0;
printf("iteration=%d\n", iter);
strcpy(src, ret);
puts(src);
char *ch;
// projit celym retezcem
for (ch=src; *ch; ch++) {
int left;
int found=0;
// pro kazdy znak zjistit, zda pro nej neexistuje prepisovaci pravidlo
// a pokud ano, provest prepis
for (left=0; left<rulesCount; left++) {
if (leftSide[left]==*ch) {
//printf("%c -- %s\n", *ch, rightSideSrc[left]);
for (k=0; rightSideSrc[left][k]; k++, j++) // provest prepis
ret[j]=rightSideSrc[left][k];
found=1;
}
}
// zadne pravidlo pro dany znak jsme nenasli, proto se znak
// pouze zkopiruje
if (!found) {
//printf("%c -- %c\n", *ch, *ch);
ret[j]=*ch;
j++;
}
}
ret[j]=0;
}
}