Problém s funkcí strtok() – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problém s funkcí strtok() – C / C++ – Fórum – Programujte.comProblém s funkcí strtok() – C / C++ – Fórum – Programujte.com

 

Sprinter
~ Anonymní uživatel
102 příspěvků
30. 12. 2012   #1
-
0
-

Ahoj,

mám problém s funkcí strtok(). Používám dvě konstrukce, které mi podle mezer rozdělují vstupní text na jednotlivá "slova". Pro speciální případ slova, ve kterém je obsažen znak @ mám nastavenou podmínku, aby toto slovo uložilo do připraveného pole. No a teď k samotnému problému - pokud je na vstupu právě znak @, tak se mi u druhé konstrukce vypíše pouze první slovo (tím funkce strtok() končí). Ovšem pokud první konstrukci zakomentuji, tak začne fungovat ta druhá.

Zdrojový kód přikládám níže:

// První konstrukce
char *token_a;
token_a = strtok(input, " ");
char e_rules [strlen(input)];
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, " ");
}

// Druhá konstrukce (funguje pouze pokud odstraním tu první, jinak vypíše jen první slovo ze vstupního textu)
while (token_b != NULL)
{
	printf("TOKEN: %s\n", token_b);
	token_b = strtok(NULL, " ");
}	
Nahlásit jako SPAM
IP: 92.62.224.–
zlz
~ Anonymní uživatel
634 příspěvků
30. 12. 2012   #2
-
0
-

Pokud první cyklus načte všechny tokeny, tak ten druhý samozřejmě nemá, co by dál načítal.

Nahlásit jako SPAM
IP: 80.188.216.–
Sprinter
~ Anonymní uživatel
102 příspěvků
30. 12. 2012   #3
-
0
-

Takže mohu v celém programu použít jen jeden takový cyklus? To nejde udělat jinak?

Nahlásit jako SPAM
IP: 92.62.224.–
Sprinter
~ Anonymní uživatel
102 příspěvků
30. 12. 2012   #4
-
0
-

Tak jsem to vyřešil vytvořením stejného pole, jako input a překopírováním. Jsou tam teď tedy jakoby dvě úplně jiná pole, takže to funguje jak má...

Nahlásit jako SPAM
IP: 92.62.224.–
vitamin+8
Grafoman
30. 12. 2012   #5
-
0
-

#3 Sprinter
Načo je dobré toto:

strtok(NULL, " ");

?

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Sprinter
~ Anonymní uživatel
102 příspěvků
30. 12. 2012   #6
-
0
-
Nahlásit jako SPAM
IP: 92.62.224.–
TheOndrap+2
Super člen
30. 12. 2012   #7
-
0
-

Ahoj,

Já strtok vůbec nepoužívám, protože jsou s nim vždycky akorát potíže. Hlavně je to "threads unsave" a jakmile jsem takhle parsoval 2 řetězce najednou, pěkně se mi to sralo .. zkus použít strtok_r nebo tak nějak, s tim se mi pracovalo mnohem líp

Nahlásit jako SPAM
IP: 88.102.250.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
Sprinter
~ Anonymní uživatel
102 příspěvků
31. 12. 2012   #8
-
0
-

No problém funkce strtok() je že "vytahuje" ze vstupu všechen text. Takže pokud chci tu konstrukci s while cyklem použít vícekrát na ten samý řetězec nastává chyba. Tu lze odstranit celkem jednoduše a sice:

char pomocne_pole [strlen(vstupni_retezec)];

strcpy(pomocne_pole, vstupni_retezec);

Dále pak pracuji jen s pomocným polem. Jednoduché a funguje to.

Ovšem teď jsem narazil na nepochopitelný případ, kde to takto nefunguje. Pracuji s úplně jiným polem ale i tak se mi prvky v původním poli vymažou... Netušíte, kde by mohl být problém?

printf("* Prvky mnoziny F: {%s} *\n", f_set); // OK
char working_f_set [strlen(f_set)];
strcpy(working_f_set, f_set);
char *token_c;
token_c = strtok(working_f_set, " ");
char elements[sizeof(token_c)];
while (token_c != NULL)
{
	
	strcpy(elements, token_c);
	char detect [3];
	detect[0] = elements[0];
	detect[1] = '.';
	detect[2] = '\0';
	if (strstr(f_set, detect) == NULL)
	{
		printf("Nenalezl jsem prvek: %c\n", detect[0]);
	}
	printf("Prvky z mnoziny F: %s\n", elements);
	token_c = strtok(NULL, " ");
}
printf("* Prvky mnoziny F: {%s} *\n", f_set); // Prazdna mnozina :-(
Nahlásit jako SPAM
IP: 92.62.224.–
Sprinter
~ Anonymní uživatel
102 příspěvků
31. 12. 2012   #9
-
0
-

Tak po testování jsem zjistil, že problém je v tomto příkazu:

char elements[sizeof(token_c)];

Když jsem nastavil, že velikost pole je třeba 80, tak to fungovalo. Furt ale nechápu v čem byla chyba, vždyť přeci mohu takto nastavit pole?...

Nahlásit jako SPAM
IP: 92.62.224.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 52 hostů

Podobná vlákna

Problém - funkce strtok — založil Petr

Problém s funkcí — založil mistr jirka

Problém s funkcí — založil mistr jirka

Problem s funkci isdigit() — založil Lukas

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý