Chybné znaky v poli – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Chybné znaky v poli – C / C++ – Fórum – Programujte.comChybné znaky v poli – C / C++ – Fórum – Programujte.com

 

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

Ahoj,

chtěl bych se zeptat, jestli by mi někdo nevysvětlil, proč mi například u níže uvedeného kódu:

char set_of_elements [sizeof(input)];
	
if (isupper(input[0]) != '\0')
{
	set_of_elements[0] = input[0];
	printf("Mnozina prvku: %s", set_of_elements);
		
}
else
{
	printf("*** Chybi startovaci symbol (nebo je spatne zadany) ***");
}

při zadání vstupu "AVC" mi obsah pole set_of_elements vypisuje "Ař)"? Mělo by se tam uložit pouze to první písmono, tedy "A". Napadlo mě, jestli není problém s ukončovacím znakem...

Nahlásit jako SPAM
IP: 92.62.224.–
KIIV
~ Moderátor
+43
God of flame
24. 12. 2012   #2
-
0
-

protoze vypisujes retezec a retezec musi byt ukoncenej... a pokud neni, vypisuje se smeti z ramky dokud se na nejakou ukoncovaci \0 nenarazi

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Sprinter
~ Anonymní uživatel
102 příspěvků
24. 12. 2012   #3
-
0
-

Přidal jsem ukončovací \0, a problém s výpisem znaků, které do pole nepatří jsem tím vyřešil. Mám ale ještě problém s následujícím usekem kodu:

char set_of_elements [500];
	
	if (isupper(input[0]) != '\0')
	{
		set_of_elements[0] = input[0];
		set_of_elements[1] = '\0';
		
		if (input[1] == ':')
		{
			char *token;
			token = strtok(input, " ");
			int i;
			for (i = 2; i <= strlen(token)-1; i++)
			{
				if (input[i] != '|')
				{
					set_of_elements[i-1] = input[i];
				}
			}
			printf("Mnozina prvku: %s\n", set_of_elements);
		}
		else
		{
			printf("*** Chybne zadany text na vstupu ***");
		}
	}
	else
	{
		printf("*** Chybi startovaci symbol (nebo je spatne zadany) ***");
	}

Výpis je správný, ale pokud dám na vstup např A:BC|CDE, tak se mi vypíše pouze ABC a zbytek CDE už ne.. přitom podmínkana oštření znaku "|" je ve for cyklu a výpočet by měl probíhat dál... 

Nahlásit jako SPAM
IP: 92.62.224.–
KIIV
~ Moderátor
+43
God of flame
24. 12. 2012   #4
-
0
-

no osetreni bych tomu nerikal... proste to jen vynechas ... a pokud je pole predem nastavene na samy \0 (na coz neni moc spoleh) tak tim preskocenim tam nechas ve vyslednem poli nejaky puvodni znak... treba cirou nahodou \0...

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Sprinter
~ Anonymní uživatel
102 příspěvků
24. 12. 2012   #5
-
0
-

#4 KIIV
Chápu, že při vstupu "S:A|aB" se mi vlastně do pole set_of_elements uloží prvky takto:

set_of_elements[0] = S

set_of_elements[1] = A

set_of_elements[2] = ????

a dál už se nic neuloží.. ale nevim jak to vyřešit.. Napadá mě jen přepsání znaku "|" na jiný znak, třeba mezeru, ale to mi nepomůže. Lze nějak odstranit přímo ten druhý index pole? Nebo lze použít nějaké jiné řešení?

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

Tak ať se snažím, jak se snažím, stále mám problém s chybnými znaky ve výpisu. Mám pole, které předem nastavím na 100 znaků (neznám předem jeho velikost). Do tohoto pole ukládám znaky (např. 5). Po ukončení cyklu chci nastavit, že znak, který by byl jako šestý je "\0". Ovšem ve výpisu se řetězec neukončí a stále hází i znaky, které jsem do něj neukládal.

	printf("*******************\n");
	printf("Gramatika:\n");
	int i = 1;
	char *token;
	
	char line_buffer [100];
	char column_buffer [100];
	token = strtok(input, " ");
	char help [strlen(token)];
	while (token != NULL)
	{
		printf("(%i) %s\n", i, token);
		strcpy(help, token);
		line_buffer[i-1] = help[0];	
		column_buffer[i-1] = help[2];	
		token = strtok(NULL, " ");
		i++;
	}
	printf("*******************\n");
	line_buffer[i] = '\0';
	column_buffer[i] = '\0';
	printf("line_buffer: %s\n", line_buffer);
	printf("column_buffer: %s\n", column_buffer);
}
Nahlásit jako SPAM
IP: 92.62.224.–
zlz
~ Anonymní uživatel
634 příspěvků
26. 12. 2012   #7
-
0
-

To i máš o jednu pozici napřed. Přidej -1 i při vkládání \0. (nebo začni s i = 0 a nic neodečítej)

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

#7 zlz
Pravda, už to funguje, nevšiml jsem si toho. Děkuji

Nahlásit jako SPAM
IP: 81.90.168.–
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, 34 hostů

Podobná vlákna

Chybné zobrazení — založil fonadius

Chybne cesty na localhoste — založil zirkon

Chybné načtení BMP — založil Lokutus7323

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ý