Ahoj mám problém s úsekem kódu, kde se snažím manipulovat s prvkami a přesouvat je v poli.
Na vstupu je např: S:aSAb S:AB A:Bb A:aA A:bB B:@
Já se snažím najít slovo, které obsahuje znak @. Z tohoto slova je pro mě důležité to, co je před dvojtečkou, čili znak B. tento znak uložím do množiny Ne. Nyní podle tohoto znaku vytvořím fiktivní slovo B:B. a uložím do množiny F. No a teď koukám na vstupní řetězec a hledám znak B, který se vyskytuje na pravé straně slova (prostě za dvojtečkou). Pokud toto slovo najdu, tak přidám tečku za znak B a uložím ho do množiny F (např. najdu S:AB - čili do F uložím S:AB.).
V podstatě se snažím vytvořit Follow algoritmus (Firts and Follow algorithm). Problém je, že právě to poslední "tečkování" nefunguje - respektive vypíše se správně jen první slovo, pak už ne... jedná se o tu poslední konstrukci (přitom když sem si to zkoušel cvičně rozepsat na papír, chybu jsem nenašel)
void follow_algorithm (char *input)
{
/* Hledani e-pravidel ve vstupnim retezci */
char text_for_f_set [strlen(input)];
strcpy(text_for_f_set, input);
char text_for_e_rules [strlen(input)];
strcpy(text_for_e_rules, input);
char *token_a;
token_a = strtok(text_for_e_rules, " ");
char e_rules [strlen(text_for_e_rules)];
while (token_a != NULL)
{
if (strchr(token_a, '@') != NULL)
{
if (e_rules[2] != '@')
{
strcpy(e_rules, token_a);
}
else
{
strcat(e_rules, token_a);
}
}
token_a = strtok(NULL, " ");
}
/*
* Ulozeni vsech prvku, ktere se daji prepsat na
* prazdny retezec do mnoziny Ne
*/
int size = ((strlen(e_rules))/3) + 1;
char ne_set [size];
int i = 0;
int j = 0;
do
{
ne_set[j] = e_rules[i];
i = i + 3;
j++;
}
while (e_rules[i] != '\0');
ne_set[j] = '\0';
/* Ulozeni fiktivniho pravidla do mnoziny F */
char f_set [500];
int iter;
for (iter = 0; iter <= strlen(f_set)-1; iter++)
{
f_set[iter] = '0';
}
f_set[0] = ne_set[0];
f_set[1] = ':';
f_set[2] = f_set[0];
f_set[3] = '.';
f_set[4] = ' ';
f_set[5] = '\0';
/* Prozatim follow pouze pro prvni prvek mnoziny Ne */
printf("* Prvky mnoziny Ne: {%s} *\n", ne_set);
printf("* Prvky mnoziny F: {%s} *\n", f_set);
char *token_b;
token_b = strtok(text_for_f_set, " ");
char help [strlen(text_for_f_set)];
while (token_b != NULL)
{
strcpy(help, token_b);
int n;
for (n = 2; help[n] != '\0'; n++)
{
if (help[n] == ne_set[0])
{
char temp [strlen(help)];
strcpy(temp, help);
int last = strlen(temp) - 1;
int m;
for (m = n+1; m >= last; m--)
{
if (m != last)
{
temp[m+1] = help[m];
}
}
if (m != last)
{
temp[last+1] = '.';
temp[last+2] = ' ';
temp[last+3] = '\0';
}
else
{
temp[n] = '.';
temp[last+2] = ' ';
temp[last+3] = '\0';
}
printf("Slovo: %s\n", temp);
strcat(f_set, temp);
}
}
token_b = strtok(NULL, " ");
}
printf("* Prvky mnoziny F: {%s} *\n", f_set);
}