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 19:11 | Zajímavý projekt

    Vývojáři Ubuntu představili projekt Myna, tj. iniciativu zaměřenou na přidání funkce převodu řeči na text do prostředí desktopu Ubuntu. Dle plánu již v Ubuntu 26.10.

    Ladislav Hagara | Komentářů: 1
    dnes 18:33 | Zajímavý software

    Společnost Epic Games představila nový open source systém pro správu verzí Lore navržený pro "bezprecedentní škálovatelnost dat i týmů a optimalizovaný pro projekty, včetně her a zábavy, které kombinují kód s velkými binárními soubory, aby uspokojil potřeby vývojářů i umělců". Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT.

    Ladislav Hagara | Komentářů: 1
    dnes 15:33 | IT novinky

    Úřad pro ochranu hospodářské soutěže (ÚOHS) provedl v říjnu 2024 místní šetření u společnosti Seznam.cz. Úřad prověřoval důvodné podezření na možné protisoutěžní jednání, konkrétně zneužití dominantního postavení. Krajský soud v Brně v květnu 2025 konstatoval, že toto šetření bylo nezákonné. Nejvyšší správní soud (NSS) včera rozhodl, že šetření bylo provedeno v souladu se zákonem. Krajský soud bude muset případ posoudit znovu.

    Ladislav Hagara | Komentářů: 1
    dnes 12:22 | IT novinky

    Byl představen skládací telefon Commodore Callback 8020. Ani hloupý, ani chytrý. Pro fanoušky Commodore a digitálního minimalismu. Bez webového prohlížeče a sociálních sítí. S předinstalovaným WhatsAppem. S operačním systémem Sailfish OS.

    Ladislav Hagara | Komentářů: 2
    dnes 08:22 | Bezpečnostní upozornění

    V OpenBSD byla objevena 27 let stará chyba v ppp pomocí níž lze vzdáleně obejít autentifikaci. Chyba byla nahlášena 12.6. a 14.6. byla opravena. Bližší info v článku A 27-Year-Old Authentication Bypass in OpenBSD's PPP Stack.

    Max | Komentářů: 7
    dnes 05:22 | Zajímavý článek

    Odpověď Evropské komise (pdf) k evropské občanské iniciativě Stop Destroying Videogames, jež je součástí hnutí Stop Killing Games: "Komise se domnívá, že v této fázi nemůže navrhnout právní povinnost zachovat hratelnost videoher poté, co přestaly být poskytovány komerčně. Důvodem jsou i stávající práva duševního vlastnictví. Podle autorského práva EU mají nositelé práv výlučná práva ke svým výtvorům. Kromě autorských práv mohou být

    … více »
    Ladislav Hagara | Komentářů: 8
    včera 16:11 | Nová verze

    Byl vydán Mozilla Firefox 152.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 152 bude brzy k dispozici také na Flathubu a Snapcraftu.

    Ladislav Hagara | Komentářů: 1
    včera 14:11 | Nová verze

    Desktopové prostředí KDE Plasma bylo vydáno ve verzi 6.7 (Mastodon). Přehled novinek i s videi a se snímky obrazovek v oficiálním oznámení. Podrobný přehled v seznamu změn.

    Ladislav Hagara | Komentářů: 21
    včera 11:44 | Komunita

    Hříčka xsnow, která na ploše spustí sněžení, je protestware. Pokud jste v Rusku (LANG=ru), zobrazuje ukrajinské vlajky.

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

    UBports, nadace a komunita kolem Ubuntu pro telefony a tablety Ubuntu Touch, vydala beta verzi Ubuntu Touch 24.04-2.0. Nová verze již počítá s výřezy pro fotoaparát (notch) a zaoblenými rohy displeje. Webový prohlížeče Morph přešel z Chromia 87 na Chromium 134. Do shellu Lomiri byl přidán editor snímků obrazovky.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (11%)
     (8%)
     (2%)
     (16%)
     (31%)
     (3%)
     (6%)
     (3%)
     (16%)
     (26%)
    Celkem 1926 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník


    Dotaz: Case insensitive porovnani v C

    tomes.io avatar 21.9.2012 01:11 tomes.io | skóre: 12 | blog: tomesh
    Case insensitive porovnani v C
    Přečteno: 371×
    Ahoj,

    potrebuju porovnavat retezce bez ohledu na velikost pisma. Resp. hledam a porovnavam podretezce ve vetach. Vygooglil jsem si, ze asi nejlepsi reseni je prevest si vse bud na mala nebo velka pismena pomoci toupper()/tolower() a pak porovnat ( POSIXovou strcasecmp jsem zavrhl, protoze kontroluje cely string naraz, nevraci ukazatel na prvni vyskyt jako case sensitive strstr(), coz je mimoradna skoda).

    Jenze jsem se zcela nepochopitelne tezce zasekl na tom, jak uz zmensena/zvetsena pismena appendovat do nejakeho retezce, ktery bude dale porovnavan.

    V nize uvedene casti kodu je klicovy while (input[i]). Ten ma za ukol zmensit pismenko po pismenku a kazde pismenko pak postupne pridavat do pomocneho "tmpstr". Jenomze tam za boha nemuzu dostat jednotliva pismenka.

    Predpokladam, ze se pri prvni iteraci pismenko, ktere je v c[0] pripne do tmpstr[0]. To taky udela, jenze na dalsi mista v poli tmpstr[1...n] se nakopiruje cely radek nacteny ze vstupniho souboru, tedy CELY retezec obsazeny v poli "input" Absolutne nechapu proc, takhle se prece funkce strstr() (ale stejne se mi tady chova i strcpy()) chovat nema.

    Prikladne, kdyz je nacteny prvni radek, promenna input obsahuje retezec
    "Prvni"

    Tak hned prvni iterace while (input[i]) dosadi do tmpsrc[0] pismenko "p" do tmpsrc[1] dosadi "P", tmpsrc[2] "r" atd az tam vypise cely retezec z pole input.

    Jeste nikdy jsem na toto podivne chovani nenarazil. Nejdirv me napadlo, ze by se mohlo jedna o to, ze se predava cela adresa input[], jenze tady jde zkratka o prachobycejne pripinani jendotlivych pismenek... nechapu to a bydy velmi rad, kdyz mi to nekdo osvetli.

    Doufam, ze jsem vse napsal srozumitelne.
    while (fgets(input, 512 , fr) != NULL){
            
            int i = 0;
            line++;
            unsigned len = strlen(input);
            
           
            char tmpstr[len];
            tmpstr[0] = 0;        //pro poreby fce strcat, ktera appenduje od prvni nuly
            
            char c[1];
           
            
            while (input[i]){
      
              c[0] = input[i];
              if (isupper(*c)) c[0]=tolower(*c);   //pismenko se predela na male jeste bez problemu  
      
              strcat(tmpstr, c); //zde problem, spolu s konvertovanym pismenkem se pripne cely obsah input[];
              i++;
            }

    Řešení dotazu:


    Odpovědi

    21.9.2012 06:53 rastos | skóre: 63 | blog: rastos
    Rozbalit Rozbalit vše Re: Case insensitive porovnani v C
    c je deklarované ako char c[1]. Teda jednoprvkové pole charov. Neskôr s ním ale zaobchádzaš ako so stringom keď ho pošleš do strcat(). To ale robí galibu, pretože nie je "zero-terminated". Neskúmal som či sú v tom ešte aj nejaké iné problémy, ale keď už si zvolil tento prístup tak skús deklarovať c ako char c[]={0,0};

    Predsa len by som ale odporučil skúsiť nájsť nejaké iné riešenie, pretože niektoré znaky sa pri prevode na veľké/malé menia počet znakov (napr. nemecké ostré s), alebo niektoré znaky nie sú v jednom char-e pri multibyte-ovom kódovaní, atď ...
    tomes.io avatar 21.9.2012 10:57 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Case insensitive porovnani v C
    Tva deklarace
    char c[]={0,0};
    pomohla, ted uz to kopiruje korektne, diky.

    Ja bych taky rad nasel jine reseni, jenze hledal jsem dlouho a na zadne jsem neprisel, nez vse prevest na mala/velka pismenka a pak pouzit strstr(). Kdyby byla nejaka funkce jako strstrt() ale case insensitive, tak beru vsema deseti :)
    21.9.2012 11:14 rastos | skóre: 63 | blog: rastos
    Rozbalit Rozbalit vše Re: Case insensitive porovnani v C
    Ak odignorujeme všetky problémy s multi-byte kodovaním a podobne tak môžeš aj hľadaný podreťazec aj prehľadávaný riadok previesť na uppercase cez strupr() a robiť strstr() na výsledku.

    Ak do úvahy pripadajú aj iné než ascii znaky, tak preveď text na wchar cez mbstowcs() a hľadaj pomocou wcsstr().
    21.9.2012 11:16 rastos | skóre: 63 | blog: rastos
    Rozbalit Rozbalit vše Re: Case insensitive porovnani v C
    ... po prevedení na uppercase cez towupper()
    21.9.2012 08:23 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Case insensitive porovnani v C
    POSIXovou strcasecmp jsem zavrhl, protoze kontroluje cely string naraz, nevraci ukazatel na prvni vyskyt jako case sensitive strstr(), coz je mimoradna skoda

    Proč by měla vracet nějaký výskyt? Výskyt čeho? Tvrdíte, že chcete porovnat dva řetězce, a přesně to strcasecmp() dělá. Vrací vám výsledek toho porovnání. Oproti tomu strstr() je funkce pro vyhledání podřetězce, takže je celkem logické, že vrací pointer na první výskyt toho podřetězce; jen jaksi neporovnává…

    Zásadní problém je úplně jiný: ta funkce ignoruje locale, takže vám například veškerá slova začínající písmenem s diakritikou zařadí až za "z". Proto je vhodnější použít strcoll().

    Doufam, ze jsem vse napsal srozumitelne.

    Moc ne. Zkuste konkrétně a přesně napsat, co vlastně potřebujete. To, co jste napsal, má příliš mnoho možných výkladů. Pokud např. potřebujete zjistit první znak, kde se dva řetězce liší (s ohledem na aktuální locale a bez rozlišení malých a velkých písmen), můžete použít mbrtowc() na načítání znaků a pak porovnávat hodnoty, které vám vrátí towlower(). Konvertovat si celý řetězec je zbytečné a neefektivní.

    tomes.io avatar 21.9.2012 10:51 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Case insensitive porovnani v C
    PSal jsem hned na zacatku,ze hledam podretezce, ne retezce. Proto jsem zavrhnul strcasecmp(). Uzivatel zada jaky podretezec, slovo, cast slova, pismenko,chce delat a muj program mu vypise kolikrat se zadany podretezec vyskytl naradku. Proto strstr(), funguje bezvadne, akorat je case sensitive...

    Jak mj program vypada je videt z tohoto vlakna kde jsem mel jiny dotaz:
    http://www.abclinuxu.cz/poradna/programovani/show/366089
    tomes.io avatar 21.9.2012 11:00 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Case insensitive porovnani v C
    Problem je v tom, ze ja potrebuju porovnat podretezce, tady i casti stringu, tudiz nemuzu pouzit ten posixovy porovnavac retezcu.

    ALe mozna... napada me jedna vec, snad kdybych si pomoci strtok() rozdeloval vety na slova (oddelovac by byla mezera) a pak porovnaval jeden token za druhym.
    21.9.2012 14:29 ::: | skóre: 14 | blog: e_lama
    Rozbalit Rozbalit vše Re: Case insensitive porovnani v C
    ja bych jenom upozornil ze ta implementace ma kvuli pouziti strcat uplne zbytecne kvadratickou slozitost. Priom by to slo udelat uplne jednoduse:
    while (input[i])
    {
            tmpstr[i] = tolower(input[i]);
            ++i;
    }
    tmpstr[i] = 0;
    
    dalsi vec je ze deklarace
    char tmpstr[len];
    
    vytvori pole dost velky na ulozeni retezce, ale ne ukoncujicy nuly

    totez:
    char c[1];
    
    proboha tam je tolik chyb ze bych to ani nespocital :-)

    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.