Nahrazení znaku v řetězci řetězcem – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Nahrazení znaku v řetězci řetězcem – C / C++ – Fórum – Programujte.comNahrazení znaku v řetězci řetězcem – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Hučák
~ Anonymní uživatel
3 příspěvky
3. 2. 2014   #1
-
0
-

Dobrý den

neví někdo jak na to?

Napište funkci char * strReplaceAll(char *s1, char ch, const char *s2), která nahradí všechny výskyty 
znaku ch řetězcem s2. Uvažujte, že v s1 je alokován dostatečný prostor. Návratovou hodnotou je ukazatel 
na výsledný řetězec, resp. hodnota NULL byl-li s2 prázdný nebo p záporné. 
Např.: strReplacecatAll(„Výraz x*x je druhá mocnina“, ‘x‘, „iks“)  “Výraz iks*iks je druhá mocnina“ 

za odpovědi děkuji.

Nahlásit jako SPAM
IP: 90.180.21.–
Reklama
Reklama
hlucheucho+10
Posthunter
3. 2. 2014   #2
-
0
-

asi zkopírovat zdrojový řetězec a kopii "nasekat" pomocí strtok a pak skládat pomocí strcpy. Bude to hodně kopírování řetězců.

hu

Nahlásit jako SPAM
IP: 188.95.60.–
hlucheucho+10
Posthunter
3. 2. 2014   #3
-
0
-

p je co?

hu

Nahlásit jako SPAM
IP: 188.95.60.–
Hučák
~ Anonymní uživatel
3 příspěvky
3. 2. 2014   #4
-
0
-

Bohužel zadání mi taky není jasné, a vzhledem k tomu že jsem začátečník nevím jak na to :-/

Nahlásit jako SPAM
IP: 88.100.114.–
Doomista+1
Stálý člen
3. 2. 2014   #5
-
0
-

Abych se vyhnul tomu sekání řetězců tak mě napadlo tohle:
1)projet si řetězec s1, spočítat výskyty znaku ch.
2)vytvořit dynamické pole char o velikosti strlen(s1)+(strlen(s2)-1)*pocet_vyskytu+1
3) kopírovat pole s1 do nového pole, pokaždé když narazíš na ch tak tam vkopírovat s2
4) poslední prvek nastavit na hodnotu '\0'
5) vrátit to nové pole

Nahlásit jako SPAM
IP: 90.176.176.–
Na vše stačí iostream...
hlucheucho+10
Posthunter
3. 2. 2014   #6
-
0
-

5 Doomista
Zadání jsem pochopil tak, že mám vrátit modifikovaný s1 - tedy výsledek uložený do stejného řetězce. Pokud to má správně fungovat, mělo by to zvládat i situaci, kdy se znak v řetězci nevyskytuje. Takže je vhodnější strtok nahradit funkcí strchr. Věta o dostatečném prostoru by na to ukazovala. Výskyty se počítat nemusí:

1. kopíruji s1 do pomocného (dynamicky alokovaného?) řetězce
2. s1 "vyprázdním" - bude to prázdný řetězec

Cyklus
2. Pomocí strchr najdu nahrazovaný znak budu provádět náhradu strtok, budu evidovat zda nalezený token byl ukončen nahrazovaným znakem
3. Přidám do s1 token pomocí strcat
4. Pokud byl token ukončen nahrazovaným znakem, přidám na konec s1 řezězec s2

hu

Nahlásit jako SPAM
IP: 188.95.60.–
Doomista+1
Stálý člen
3. 2. 2014   #7
-
0
-

#6 hlucheucho
pokud mám vracet modifikovaný s1, pak trochu postrádá smysl ta návratová hodnota funkce

Nahlásit jako SPAM
IP: 90.176.176.–
Na vše stačí iostream...
hlucheucho+10
Posthunter
3. 2. 2014   #8
-
0
-

je to školní úloha. Kromě toho, třeba strcat podobně funguje - za s1 přidá s2 a vrátí s1

hu

Nahlásit jako SPAM
IP: 188.95.60.–
hlucheucho+10
Posthunter
3. 2. 2014   #9
-
0
-

   

char * strReplaceAll(char *s1, char ch, const char *s2)
{
	char *pom;
	char *vyskyt;
	char *token;

	if (0 == strlen(s2)) {
	  return NULL;
	}
	pom = malloc(strlen(s1));  //kopie s1
	strcpy(pom, s1);
	s1[0] = 0x00;
	token = pom;

	do
	{
		vyskyt = strchr(token, ch);  //vyskyt znaku
		if (vyskyt != NULL)
		{
		  *vyskyt = 0x00;  //udela token
	    }
		strcat(s1, token);  //do vysledku kopiruje cast pred vyskytem znaku
		if (vyskyt != NULL)
		{
			strcat(s1, s2);  //do mista vyskytu znaku kopiruje s2
			token = vyskyt + 1;
		}
	} while (vyskyt != NULL);

	free(pom);
	return s1;
}
Nahlásit jako SPAM
IP: 188.95.60.–
Doomista+1
Stálý člen
3. 2. 2014   #10
-
0
-

#9 hlucheucho
jestli se na to dobře dívám, tak ještě nulový znak

Nahlásit jako SPAM
IP: 90.176.176.–
Na vše stačí iostream...
hlucheucho+10
Posthunter
3. 2. 2014   #11
-
0
-

#10 Doomista
kde?

Zkoušel jsem to v C++ Builderu.

hu

Nahlásit jako SPAM
IP: 188.95.60.–
hlucheucho+10
Posthunter
3. 2. 2014   #12
-
0
-

   

char * strReplaceAll(char *s1, char ch, const char *s2)
{
	char *pom;
	int i, j, k;

	if (0 == strlen(s2)) {
	  return NULL;
	}
	pom = malloc(strlen(s1));  //kopie s1
        strcpy(pom, s1);

	for (i = 0, j= 0; pom[i] != 0; i++)  //projdu kopii s1 znak po znaku
	{
	  if (pom[i] == ch)
	  {
	     for (k = 0; s2[k] != 0, k++)  //vyskyt znaku nahradim obsahem s2
	     {
		s1[j] = s2[k];
		j++;
	     }
	  }
	  else
	  {
	     s1[j] = pom[i];  //jiny znak kopiruji
	     j++;
	  }
	}

        free(pom);
	s1[j] = 0;  //ukoncim vysledny retezec
	return s1;
}

jiné řešení, bez záruky (nezkoušel jsem ho)

hu

Nahlásit jako SPAM
IP: 188.95.60.–
Hučák
~ Anonymní uživatel
3 příspěvky
4. 2. 2014   #13
-
0
-

Děkuji za pomoc.

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

Podobná vlákna

Nahrazení znaků mezi tagy — založil Zuben

Nahrazení znaku v byte poli — založil trambo

Moderátoři diskuze

 

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