abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
včera 02:20 | Zajímavý článek

David Revoy, autor open source webového komiksu Pepper&Carrot nebo portrétu GNU/Linuxu, upozorňuje na svém blogu, že nový Inkscape 0.92 rozbíjí dokumenty vytvořené v předchozích verzích Inkscape. Problém by měl být vyřešen v Inkscape 0.92.2 [reddit].

Ladislav Hagara | Komentářů: 0
včera 02:02 | Komunita

Øyvind Kolås, hlavní vývojář grafických knihoven GEGL a babl, které využívá grafický program GIMP, žádá o podporu na Patreonu. Díky ní bude moci pracovat na vývoji na plný úvazek. Milník 1000 $, který by stačil na holé přežití, se již téměř podařilo vybrat, dalším cílem je dosažení 2500 $, které mu umožní běžně fungovat ve společnosti.

xkomczax | Komentářů: 12
21.1. 23:54 | Pozvánky

DevConf.cz 2017, již devátý ročník jedné z největších akcí zaměřených na Linux a open source ve střední Evropě, proběhne od pátku 27. ledna do neděle 29. ledna v prostorách Fakulty informačních technologií Vysokého učení technického v Brně. Na programu je celá řada zajímavých přednášek a workshopů. Letos je povinná registrace.

Ladislav Hagara | Komentářů: 0
21.1. 22:11 | Nová verze

Byla vydána verze 1.0.0 emulátoru terminálu Terminology postaveného nad EFL (Enlightenment Foundation Libraries). Přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
20.1. 17:00 | Nová verze

Byl vydán Docker 1.13. Přehled novinek na YouTube a v poznámkách k vydání na GitHubu. Docker umožňuje běh aplikací v softwarových kontejnerech (Wikipedia).

Ladislav Hagara | Komentářů: 6
20.1. 15:51 | Komunita

Mozilla.cz informuje, že nástroje pro webové vývojáře se možná oddělí od Firefoxu a stanou doplňkem. Nástroje pro webové vývojáře prošly velkým přepisem a tým, který se stará o jejich vývoj, by uvítal možnost jejich častějších aktualizacích nezávisle na vydávání nových verzí Firefoxu.

Ladislav Hagara | Komentářů: 10
20.1. 07:00 | Humor

Čtenářům AbcLinuxu vše nejlepší k dnešnímu Dni zvýšení povědomí o tučňácích (Penguin Awareness Day).

Ladislav Hagara | Komentářů: 0
20.1. 06:00 | Komunita

Bylo spuštěno hlasování o přednáškách a workshopech pro letošní InstallFest, jenž proběhne o víkendu 4. a 5. března v Praze. Současně byla oznámena změna místa. InstallFest se letos vrací zpět na Karlovo náměstí do budovy E.

Ladislav Hagara | Komentářů: 0
20.1. 02:48 | Komunita

Greg Kroah-Hartman potvrdil, že Linux 4.9 je jádrem s prodlouženou upstream podporou (LTS, Long Term Support). Podpora je plánována do ledna 2019. Aktuální jádra s prodlouženou podporou jsou tedy 3.2, 3.4, 3.10, 3.12, 3.16, 3.18, 4.1, 4.4 a 4.9.

Ladislav Hagara | Komentářů: 0
20.1. 00:11 | Zajímavý článek

Výrobce síťových prvků, společnost Netgear, spustila nový program, který slibuje vývojářům, expertům, ale i běžným uživatelům vyplacení finanční odměny za nalezení bezpečnostních chyby v jejich produktech. Za nalezení zranitelnosti v hardware, API nebo mobilní aplikaci nabízí odměnu od 150 do 15 tisíc dolarů (dle závažnosti).

Michal Makovec | Komentářů: 0
Jak se stavíte k trendu ztenčování přenosných zařízení (smartphony, notebooky)?
 (10%)
 (2%)
 (74%)
 (4%)
 (10%)
Celkem 367 hlasů
 Komentářů: 25, poslední 21.1. 13:34
Rozcestník
Reklama

Dotaz: C - přístup ke jednotlivým znakům řetězce

11.11.2009 11:19 Afill
C - přístup ke jednotlivým znakům řetězce
Přečteno: 896×

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:


Odpovědi

11.11.2009 11:41 Atom321 | skóre: 20
Rozbalit Rozbalit vše Základy
Pane kolego, tudy cesta nevede. Pokud to má být pokus ofixlovat nějakou práci do školy, požádejte zkušenějšího kamaráda. Chcete-li opravdu programovat, musíte se to nejprve naučit.

Dobrým začátkem s C je "Učebnice jazyka C" od P. Herouta. Ovšem vám by se ještě předtím hodila spíš nějaká středoškolská skripta o programování jako takovém.
11.11.2009 11:54 Afill
Rozbalit Rozbalit vše Re: Základy
Děkuji za konstruktivní návrh, ale bohužel k řešení to nevede. Jsem zvyklý na jiné programovací jazyky, které mají práci s řetězci "jednodušší" a jsem si vědom, že mi některé základy z jazyka C unikají. Nicméně C příliš často nepoužívám. Samozřejmě jsem před položením dotazu hledal kde se dalo. Bohužel marně.

Mimochodem nevím jak vy, ale pod pojmem "ofixlovat" si představuji něco opsat, ne něco pochopit.
11.11.2009 14:55 Atom321 | skóre: 20
Rozbalit Rozbalit vše Re: Základy
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.
11.11.2009 12:15 Afill
Rozbalit Rozbalit vše Re: C - přístup ke jednotlivým znakům řetězce
Už jsem na to přišel. Vytvořil jsem nový řetězec a alokoval pro něj paměť novy = (char *) malloc(strlen(stary));

Ještě se mi to někde ztrácí v paměti, ale na to snad už přijdu.
11.11.2009 14:21 Atom321 | skóre: 20
Rozbalit Rozbalit vše Re: C - přístup ke jednotlivým znakům řetězce
Chyba. Řetězce v C jsou ukončeny nulou (znakem s kódem 0), který se do celkové délky nepočítá.

Správně je tedy:
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.
11.11.2009 12:26 Marble | skóre: 27 | blog: marble | Švédsko
Rozbalit Rozbalit vše Re: C - přístup ke jednotlivým znakům řetězce
Ta funkce je IMO v pořádku. Teda záleží na tom, co přesně od ní čekáš. Pokud ji budeš volat s parametrem, který je odkazem do paměti na alokovaný string, tak fajn. Pokud ji ale budeš volat s konstantou (Fce("ABCDEFGHIJ");), tak skončí na tom, že se snaží měnit právě přímo svůj parametr.

Přiřazení lokální proměnní na začátku totiž jen přiřadí ten pointer, tudíž je vlastně zbytečné. Předpokládám, že cheš ve funkci vytvořit kopii stringu a tu upravit. V tom případě se v čistém C nevyhneš mallocu nové paměti, do které ten string zkopíruješ (strcpy) a pak teprv budeš upravovat.

Jo a ten, kdo tu funkci volal si pak samozřejmě musí alokovanou pamět uklidit. Funkce sama to z principu udělat nemůže.

Druhým přiblížením, použitým v některých C knihovnách, je místo alokace paměti použít nějakou globální proměnnou deklarovanou v knihovně, ve které je i ona Fce (tahle proměnná nemusí být viditelná ven z knihovny). Fce si pak string zkopíruje do této proměnné. Výhodou je, že volající nemusí uklízet pamět, nevýhodou je, že po opětovném volání Fce je pamět přepsána a tudíž pointer vrácený dřívějším voláním bude odkazovat na "špatný" string. (Každé volání prostě vrátí stejný pointer.)

11.11.2009 12:38 moira | skóre: 30 | blog: nesmysly
Rozbalit Rozbalit vše Re: C - přístup ke jednotlivým znakům řetězce
Je důvod proč nepoužít strrev?
Překladač ti nikdy neřekne: "budeme kamarádi"
20.11.2009 17:12 bajo | skóre: 3
Rozbalit Rozbalit vše Re: C - přístup ke jednotlivým znakům řetězce
jedine co tu potrebujes je troska pochopit ukazovatele. Vidiet za im nerozumies.
20.11.2009 18:39 ext3fs
Rozbalit Rozbalit vše Re: C - přístup ke jednotlivým znakům řetězce
Pokud jde jen o prehozeni tak neco takoveho by mohlo fungovat:
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);
}

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.