Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Ahoj, mým úkolem je v ověřit, jestli v daném řetězci je řetězec "programovani". Můj kód vypadá takto
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int je_obsazen (char *retezec)
{
const char *p = retezec;
char programovani[] = "programovani";
const char *q = programovani;
int je_rovno = 1;
if (strlen(programovani) > strlen(retezec))
{
return 0;
}
else
{
while (*p != '\0')
{
while ((*q != '\0') || (je_rovno == 0))
{
if (*p != *q)
je_rovno = 0;
q++;
p++;
}
if (je_rovno == 1)
return 1;
q = programovani;
p = retezec;
p++;
je_rovno = 1;
}
return 0;
}
}
int main (void)
{
char retezec[] = "zkurvenyprogramovani";
if (je_obsazen (retezec) == 1)
printf("Programovani je v retezci obsazeno!\n");
else
printf ("Programovani neni v retezci obsazeno!\n");
return 0;
}
Ale nefunguje, proč? Děkuji moc.
Offline

1) Moc nechápu, prčo tam vůbec ukazetele p a q jsou, akorát ten kód znepřehledňují. Ukazatele retezec a programovani stačí.
2) if (je_rovno = 1) tady mají asi být dvě rovnítka.
Offline

No moc nechápu, proč používáš syntaxi *p a p++ místo klasického p[i]. Kromě toho, že to je, myslím si, méně čitelné, tak v tom bude nejspíš i další chyba — když v tom vnitřním cyklu zjistíš, že tohle není podřetězec „programovani” (je_rovno = 0;), tak bys měl i resetovat ukazatel q na začátek.
Offline
↑ Lukee:
no ja bych rad, ale nevim, jak mam resetovat ukazatel na zacatke, tzn kdyz
}
if (je_rovno == 1)
return 1;
p++;
je_rovno = 1;
}
prepisu na
}
if (je_rovno == 1)
return 1;
q = programovani;
p++;
je_rovno = 1;
}
tak to porad nefunguje, ale nevim ,jestli tohle to co jsi rikal
Offline

Nějak tak. Stejně tak ale musíš vracet ukazatel p. Proto je blbost používat ty pointery a lepší je používat standardní syntaxi s []. Takhle si to užij :). V jednom whilu máš navíc zase jedno rovnítko, tos asi taky nechtěl: while ((*q != ‚\0') || (je_rovno = 0))
No a pak tam máš nejvíc nejlepší chybu, ale to je trest za to, že jsi sprostý, tak ti ji neřeknu :-))
Offline
↑ Lukee:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int je_obsazen (char *retezec)
{
char *p = retezec;
char programovani[] = "programovani";
char *q = programovani;
int je_rovno = 1;
char *pomocna = p;
if (strlen(programovani) > strlen(retezec))
{
return 0;
}
else
{
while (*p != '\0')
{
pomocna = p;
while ((*q != '\0') || (je_rovno == 0))
{
if (*p != *q)
je_rovno = 0;
q++;
p++;
}
if (je_rovno == 1)
return 1;
p = pomocna;
q = programovani;
p++;
je_rovno = 1;
}
return 0;
}
}
int main (void)
{
char retezec[] = "zkurvenyprogramovani";
if (je_obsazen (retezec) == 1)
printf("Programovani je v retezci obsazeno!\n");
else
printf ("Programovani neni v retezci obsazeno!\n");
return 0;
}
Tak jsem to upravil, v dalším pointru si pamatuju tu puvodni pozici p, pridal jsem jeste return 0, kdyz to cely projde a nic nenajde, ale stale tapu...
tak jsem to jeste upravil, ale fakt uz nevim, any idea?
Offline