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 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ářů: 0
    včera 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ářů: 0
    včera 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ářů: 0
    včera 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ářů: 1
    včera 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ářů: 6
    včera 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ářů: 10
    16.6. 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
    16.6. 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ářů: 23
    16.6. 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ářů: 40
    16.6. 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 1928 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník


    Dotaz: Postfixova kalkulacka v C: osetreni neplatnych vstupu

    tomes.io avatar 14.3.2012 21:38 tomes.io | skóre: 12 | blog: tomesh
    Postfixova kalkulacka v C: osetreni neplatnych vstupu
    Přečteno: 1147×
    Ahoj, tvořím postfixovou kalkulačku a potýkám se s problémem, jak ošetřit neplatné vstupy (špatná čísla -123abc není číslo-, příliš málo operandů pro operátor, úplně prázdný vstup).

    Nize uvadim mou implementaci (bez definic fcí, pouze main, na pochopeni by to melo stacit). Ošetřil jsem případ dělení nulou a neplatného operátoru. Dotaz bych rozdělil do dvou:

    PRVNI - zaporna čísla:

    Tato podoba neumí pracovat se zápornými čísly - považuje je za neplatný vstup. Když však odstraním poslední ELSE s warningem:
               else {
    
                 printf("CHYBA: Neplatny vstup!\n");
                 exit(1);
    tak mi kalkulačka počítá snadno i se zápornými čísly, ale také načítá veškeré další znaky, které při výpočtu ignoruje, ale na vstupu by být neměly.

    Otázka tedy zní, jak tyto znaky odfiltrovat (či jinak ošetřit), aby na vstupu byla pouze čísla, platné operátory a vše ostatní by končilo errorem a koncem programu s příslušnou hláškou. Snad by se to dalo vyřešit nějakou vhodnou podmínkou na vstupu?

    DRUHY - málo nebo žádné znaky na vstupu:

    Zatím jsem nepřišel na to, jak ošetřit vstup, nak terém není nic, mezera, mezera a pouze číslo, mezera číslo a operátor. Prostě nedostatečný vstup. Stand nějak využít fci strncmp?

    Byl bych rád, kdybyste mě někdo nakopnuli správným směrem. Píšu to od rána a už mi to nemyslí :)

    Zde má dosavadní implementace.

    int main()
     {
         //int vysledek;
         int numInp;
         char vstup[15];
         int op;
         int vysledek = 0;
         int i;
         int end = 0;
         
         while(end != EOF){
    
             end = scanf("%s", vstup);   //Program postupně bude brát slova ze vstupu...
             if(end == EOF)
                 break;
    
    
    
         numInp = atoi(vstup);
    
         for(i = 0; i < strlen(vstup); i++){
    
             if(isdigit(vstup[i])) {     //pokud načetl číslo...
    
                 numInp = atoi(vstup);
                 push(numInp);           //...přidá jej na vrchol zásobníku...
    
             }
    
    
    
             else if(strlen(vstup) == 1){
    
                        switch(vstup[i])    /* ...pokud načetl operátor, vezme dvě čísla z vrcholu zásobníku,
                                            *aplikuje na ně načtený operátor a výsledek uloží zpět na zásobník.*/
                        {
                        case '+':
                            vysledek = push(pop() + pop());
                            break;
                        case '-':
                            op = pop();
                            vysledek = push(pop() - op);
                            break;
                        case '*':
                            vysledek = push(pop() * pop());
                            break;
                        case '/':
                            op = pop();
                            if (op == 0){                          
                                 printf("Nelze delit nulou\n");
                                 exit(1);
                               }
                            else
                            vysledek = push(pop() / op);
                            break;
                        default:
                            printf("CHYBA: Neplatny vstup!\n"); //všechny jiné znaky (jednoznakové) než výše uvedené operandy
                            exit(1);
                        }
                 }
    
               else {
    
                 printf("CHYBA: Neplatny vstup!\n"); // filtruje "smetí" typu sdf125, ale i záporná čísla
                 exit(1);
             }
    
           }
         }
    
         printf("%d\n", vysledek);
     return 0;
    }

    Řešení dotazu:


    Odpovědi

    15.3.2012 00:00 kuka
    Rozbalit Rozbalit vše Re: Postfixova kalkulacka v C: osetreni neplatnych vstupu
    To si musis vyjasnit, co vlastne potrebujes. Pokud najdes cislici, tak na to pustis atoi. To samozrejme neni optimalni, viz man atoi. Pokud je vstup primo od uzivatele, je treba ho neustale kontrlovat s jista paranoia je na miste. Tzn. napriklad nacitat tak dlouho, dokud jsou na vstupu cislice nebo desetinna tecka (unarni minus, scientific notace atd...) a terprve pak to prevadet na cislo. Podobne se osetri nespravna sekvence oparatoru (dvakrat plus za sebou) apod.
    16.3.2012 14:51 Sten
    Rozbalit Rozbalit vše Re: Postfixova kalkulacka v C: osetreni neplatnych vstupu
    atoi je zlo. Používejte strtol a příbuzené funkce.
    tomes.io avatar 16.3.2012 22:28 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Postfixova kalkulacka v C: osetreni neplatnych vstupu
    Ano, strol to vyresil. Uzaviram tedy problem.
    tomes.io avatar 16.3.2012 22:49 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Postfixova kalkulacka v C: osetreni neplatnych vstupu
    no tak koukam, ze ne uplne. pri odecitani napr 4 0 - mi to haze zaporny vysledek.
    tomes.io avatar 16.3.2012 23:12 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Postfixova kalkulacka v C: osetreni neplatnych vstupu
    no, vyreseno, byla to jen drobnost :)
    Fuky avatar 16.3.2012 10:38 Fuky | skóre: 52 | blog: 4u
    Rozbalit Rozbalit vše Re: Postfixova kalkulacka v C: osetreni neplatnych vstupu
    $ man strtol strtod strtof strtold
    int main(int argc, char *argv[]) { int base; char *endptr, *str; long val; if (argc < 2) { fprintf(stderr, "Usage: %s str [base]\n", argv[0]); exit(EXIT_FAILURE); } str = argv[1]; base = (argc > 2) ? atoi(argv[2]) : 10; errno = 0; /* To distinguish success/failure after call */ val = strtol(str, &endptr, base); /* Check for various possible errors */ if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) || (errno != 0 && val == 0)) { perror("strtol"); exit(EXIT_FAILURE); } if (endptr == str) { fprintf(stderr, "No digits were found\n"); exit(EXIT_FAILURE); } /* If we got here, strtol() successfully parsed a number */ printf("strtol() returned %ld\n", val); if (*endptr != '\0') /* Not necessarily an error... */ printf("Further characters after number: %s\n", endptr); exit(EXIT_SUCCESS); } $ ./a.out 123 strtol() returned 123 $ ./a.out ' 123' strtol() returned 123 $ ./a.out 123abc strtol() returned 123 Further characters after number: abc $ ./a.out 123abc 55 strtol: Invalid argument $ ./a.out '' No digits were found $ ./a.out 4000000000 strtol: Numerical result out of range
    tomes.io avatar 16.3.2012 14:54 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Postfixova kalkulacka v C: osetreni neplatnych vstupu
    Fuky, diky za hint. strtol() je ta fce, kterou asi hledam. Zkusim a dam vedet.
    rADOn avatar 16.3.2012 13:49 rADOn | skóre: 44 | blog: bloK | Praha
    Rozbalit Rozbalit vše Re: Postfixova kalkulacka v C: osetreni neplatnych vstupu
    Nehledáš náhodou nějaký ten flex/bison nebo něco podobného?
    "2^24 comments ought to be enough for anyone" -- CmdrTaco
    tomes.io avatar 16.3.2012 14:20 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Postfixova kalkulacka v C: osetreni neplatnych vstupu
    az doted, nez jsem si to diky tobe vygoolil, jsem o zadnem bisonu neslysel :)

    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.