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í
×

    dnes 12:22 | IT novinky

    V březnu byla oznámena spolupráce GrapheneOS s Motorolou. Nejnovější vlajka Motorola Signature 27 je první Motorola s oficiální podporou GrapheneOS. GrapheneOS (Wikpedie) je varianta Androidu zaměřující se na bezpečnost a soukromí.

    Ladislav Hagara | Komentářů: 0
    dnes 04:55 | Nová verze

    Omarchy (Wikipedie) je linuxová distribuce s dlaždicovým správcem oken Hyprland. Založena je na Arch Linuxu. Vydána byla v nové verzi 4.5.0. Nově také pro Apple Silicon, konkrétně pro M1/M2/M3/Neo MacBooky.

    Ladislav Hagara | Komentářů: 3
    dnes 03:22 | Nová verze

    Byla vydána nová stabilní verze 8.3 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 156 s bezpečnostními opravami z Chromia 157. Přehled novinek i s náhledy v příspěvku na blogu.

    Ladislav Hagara | Komentářů: 0
    včera 19:53 | Bezpečnostní upozornění
    V Xenu objevena zranitelnost. Chyba v mechanismu grant copy umožňuje škodlivému virtuálnímu stroji číst a přepisovat libovolnou paměť jiných VM včetně privilegované domény Dom0. Dotčené verze jsou Xen 4.6 a novější. V upstreamu jsou dostupné patche pro Xen 4.17 až 4.19 a vývojovou větev. Pro starší nepodporované verze 4.6–4.16 nejsou v XSA-523 přiloženy opravy.
    vencour | Komentářů: 0
    včera 16:55 | Nová verze

    Multimediální přehrávač mpv byl vydán ve verzi 0.42.0. Jde o větší balík změn po bezmála roce. Mimo jiné se lépe integruje s Waylandem nebo rozšiřuje podporu DVD/Blu-ray, např. umožňuje přehrávat rovnou obrazy médií (soubory iso).

    ʚĭɞ 🍉 | Komentářů: 0
    včera 12:22 | Nová verze

    Desktopové prostředí LXQt (Lightweight Qt Desktop Environment, Wikipedie) vzniklé sloučením projektů Razor-qt a LXDE bylo vydáno ve verzi 2.5.0. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    včera 12:11 | Nová verze

    Byla vydána (𝕏) nová verze 8.0 LTS open source monitorovacího systému Zabbix (Wikipedie). Přehled novinek v oznámení na webu, v poznámkách k vydání a v aktualizované dokumentaci.

    Ladislav Hagara | Komentářů: 0
    včera 04:22 | Nová verze

    Byla vydána verze R14.1.7 desktopového prostředí Trinity Desktop Environment (TDE, fork KDE 3.5, Wikipedie). Přehled novinek v poznámkách k vydání, podrobnosti v seznamu změn.

    JZD | Komentářů: 4
    včera 00:33 | Nová verze

    Bazzite (Wikipedie), tj. linuxová distribuce vycházející z Fedora Linuxu a optimalizována pro hraní počítačových her, byla vydána ve verzi 45. S Open Gaming Collective (OGC) jádrem a novým Easy Anti-Cheatem pro Linux (EAC Linux v2).

    Ladislav Hagara | Komentářů: 0
    4.11. 22:11 | Bezpečnostní upozornění

    MikroTik zveřejnil vlastní bezpečnostní upozornění potvrzující, že zranitelnost linuxového jádra postihuje také RouterOS 7. Jde o use-after-free při zpracování IPv4 TCP spojení s IP options. Zranitelnost se týká provozu směřujícího na TCP službu samotného routeru, nikoli paketů, které router pouze přeposílá. Opraveno v long-term od 7.24.6, v stable od 7.25.1 a devel od 7.26beta5.

    vencour | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (9%)
     (7%)
     (4%)
     (20%)
     (30%)
     (9%)
     (5%)
     (2%)
     (14%)
     (20%)
    Celkem 2987 hlasů
     Komentářů: 34, poslední 26.10. 08:24
    Rozcestník

    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: 1261×

    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
    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ákno • Nahoru

    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.