Mazání string – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Mazání string – C / C++ – Fórum – Programujte.comMazání string – C / C++ – Fórum – Programujte.com

 

Petr
~ Anonymní uživatel
746 příspěvků
18. 12. 2019   #1
-
0
-

Ahojte neví někdo jak tohle udělat bez pomocí knihovny string?

int main() { char retezec[] = ""; 

char word[] = "";

int pocet = delete_missing(retezec, word);

printf("smazano: %i\nnovy retez: %s", pocet, s); /* predchozi printf vytiskne: smazano: 4 novy retez: bb cc dd */ return 0;

Program má porovnat dva řetezce a smazat vše co je navíc v retezec z wordu

Nahlásit jako SPAM
IP: 217.170.105.–
gna
~ Anonymní uživatel
1889 příspěvků
19. 12. 2019   #2
-
0
-

K jednotlivým znakům řetězce se dostaneš operátorem [], na průchod řetězcem můžeš použít for, na testování znaků if. Řetězce jsou ukončeny nulovým znakem.

Znaky z řetězce (resp. obecně prvky z pole) nejde vyloženě odstranit. Pokud máš měnit původní řetězec, tak to musíš udělat posunutím následujících znaků.

Z toho zadání mě napadá několik variant, jak by to mělo fungovat. Kdyžtak ukaž víc příkladů vstupních a výstupních hodnot.

Nahlásit jako SPAM
IP: 213.211.51.–
19. 12. 2019   #3
-
+1
-
Zajímavé

Zadání rozumím tak, že se z retezec má odstranit vse, co není ve word.  Svádí mne to k řešení word zkopírovat do retezec a tak nahradit jeho původní obsah. Při známkování bych rychle vystřízlivěl z pocitu geniality.

Co všechno může vzniknout z nesrozumitelného (zde asi spíš zkomoleného) zadání.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Petr
~ Anonymní uživatel
746 příspěvků
19. 12. 2019   #4
-
0
-

Přesněji je to zadáno takto 


Funkce smaže z řetězce všechna slova, které se nacházejí ve word. Prvním znakem nesmí být mezera, jednotlivá slova jsou mezerou oddělené a za posledním slovem nesmí být mezera mezera a funkce vrátí jako návratovou hodnotu počet smazaných slov :)

Nahlásit jako SPAM
IP: 217.170.105.–
gna
~ Anonymní uživatel
1889 příspěvků
19. 12. 2019   #5
-
0
-

Schválně jsem to napsal tak, že to budeš muset přepsat podle svého (a možná tam mám něco špatně), ale pro inspiraci to musí stačit.

int is_same(char *p, char *q)
{
	while (*p != ' ' && *p != 0 &&
	       *q != ' ' && *q != 0 &&
	       *p == *q) {
		p++;
		q++;
	}

	return ((*p == ' ' || *p == 0) &&
	        (*q == ' ' || *q == 0));
}

int is_any_of(char *word, char *set)
{
	while (*set)
	{
		while (*set == ' ')
			set++;
		if (is_same(word, set))
			return 1;
		while (*set != ' ' && *set != 0)
			set++;
	}

	return 0;
}

int delete_missing(char *retezec, char *slova)
{
	int deleted = 0;
	char *src = retezec, *dst = retezec;

	while (*src) {
		while (*src == ' ')
			src++;
		if (!*src)
			break;
		if (is_any_of(src, slova)) {
			if (dst != retezec)
				*dst++ = ' ';
			while (*src != ' ' && *src != 0)
				*dst++ = *src++;
		} else {
			deleted++;
			while (*src != ' ' && *src != 0)
				src++;
		}
	}
	*dst = 0;

	return deleted;
}

int main()
{
	char retezec[] = " tak se na to  podivame jak to pofrci ";
	char slova[] = "se to pofrci  na";

	int deleted = delete_missing(retezec, slova);
	printf("smazano %d, vysledek %s\n", deleted, retezec);

	return 0;
}
Nahlásit jako SPAM
IP: 213.211.51.–
kubkot
~ Anonymní uživatel
2 příspěvky
4. 2. 2020   #6
-
0
-

#5 gna
Paradni odpoved, jenom pro mne zacatecnika je pouziti pointeru komplikovanejsi, zkousel jsem to napsat bez nich, ale to nefunguje vubec, muzu se zeptat jestli se to da prepsat i bez nich a kdyztak jak?

Nahlásit jako SPAM
IP: 217.170.105.–
gna
~ Anonymní uživatel
1889 příspěvků
4. 2. 2020   #7
-
0
-

#6 kubkot
Vždycky tam pointry budou, ale můžeš s nimi pracovat jako s polem.

Ale pointa byla v tom, že je tam jen ++ a ' ', tedy procházení po písmenech/slovech.

// otestuje jestli retezce `p` a `q`zacinaji stejnym slovem
int is_same(char *p, char *q)
{
	// prochazime retezce dokud nejsme na konci slova
	// a dokud se znaky na aktualni pozici rovnaji

	// pokud jsme v obou retezcich na konci slova
	// tak retezce zacinaji stejnym slovem
}

// otestuje jestli slovo `word` je v seznamu `set`
int is_any_of(char *word, char *set)
{
	// projdeme jednotliva slova `setu`
	// a porovname je s `word`
}

// z retezce `retezec` vymaze slova, ktera nejsou v seznamu `slova`
int delete_missing(char *retezec, char *slova)
{
	// projdeme jednotliva slova `retezce`
	// a pokud je slovo v seznamu `slova`
	// tak ho zkopirujeme do vystupu
		// a pokud to neni prvni slovo
		// tak nejdrive vlozime mezeru
	// jinak slovo preskocime a zvysime pocitadlo
}

Napiš si to jakkoliv jinak ti to vyhovuje.

Nahlásit jako SPAM
IP: 213.211.51.–
kubkot
~ Anonymní uživatel
2 příspěvky
5. 2. 2020   #8
-
0
-

#7 gna
Aha, ok, diky za vysvetleni :-)

Nahlásit jako SPAM
IP: 217.170.105.–
MilanL+1
Grafoman
5. 2. 2020   #9
-
0
-

#6 kubkot
no začátečník místo pointerů použije indexy do pole

bez pointerů bys do těch is_..  funkcí posílal místo pointerů indexy + navíc počáteční pozici obou řetězců

a pak např. místo *p == *q použil retezec[p] == slova[q]

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

Podobná vlákna

String to hex ebo Byte()"string" — založil Roman Uherek

Mazání ve stringgrid — založil katy

Mazaní komentářu — založil Jakub Kahoun

Mazání adresářů — založil Petr

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ý