Portál AbcLinuxu, 9. května 2025 18:19
Dobrý den, řeším jedem problém, který mi docela láme hlavu. Řekněme, že mám nějaký řetězec a chci jej předat jako parametr funkci, která vrátí stejně dlouhý řetězec s přeházenými písmeny. Jak na to? Když zkusím třeba:
char *Fce(char *str)
{
char *newStr = str;
newStr[1] = newStr[6]; // Zde je již chyba!
printf("%c\n", newStr[1]);
return newStr;
}
Jde o to, že jsem zkoušel všemožné kombinace, ale zkrátka jsem nepřišel na to, jak prohodit znaky u jiného řetězce než s předem definovanou délkou (např: "char str[10];").
Byl by někdo tak laskav a napsal mi takovou funkci která přehodí některé znaky a vrátí upravený řetězec? Děkuji
Řešení dotazu:
Děkuji za konstruktivní návrh, ale bohužel k řešení to nevede.Ale vede. Jen delší cestou, než jste ochoten akceptovat.
Samozřejmě jsem před položením dotazu hledal kde se dalo. Bohužel marně.To jste zřejmně minul tento článek: http://www.linuxsoft.cz/article.php?id_article=842
Mimochodem nevím jak vy, ale pod pojmem "ofixlovat" si představuji něco opsat, ne něco pochopit.Ano, přesně tak. Pokud chcete pochopit, hotové řešení jedné konkrétní funkce vám stačit nebude.
novy = (char*) malloc(strlen(stary)+1); /* alokace stringu stejne velikosti */ if (novy == NULL) { /* nahlasit chyby alokace */ } strcpy(novy,stary); /* zkopirovani puvodniho stringu do nove alokovane pameti */ /* ... pouziti ... */ free(novy); /* dealokace (uvolneni pameti) */Místo malloc a strcpy lze také použít strdup:
novy = strdup(stary); /* alokace noveho stringu stejne velikosti a zkopirovani obsahu ze stareho */ if (novy == NULL) { /* nahlasit chyby alokace */ } /* ... pouziti ... */ free(novy); /* dealokace (uvolneni pameti) */Funkce strdup() není součástí ANSI C, tedy nemusí být přenositelná na jiné systémy.
char *prehod(const char *str) { char *buff; int n, i = 0; if ((buff = (char *)malloc((strlen(str) + 1) * sizeof(char))) == NULL) { fprintf(stdout, "Chyba alokace.\n"); exit (1); } for(n = strlen(str) - 1; n >= 0; n--) buff[i++] = str[n]; buff[i] = '\0'; return (buff); } int main(void) { char str[5]; strcpy(str, "ahoj"); fprintf(stdout, "%s\n", prehod(str)); return (0); }
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.