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 13:11 | Nová verze

    Bylo vydáno OpenBSD 7.8. S předběžnou podporou Raspberry Pi 5. Opět bez písničky.

    Ladislav Hagara | Komentářů: 0
    dnes 05:44 | Nová verze Ladislav Hagara | Komentářů: 2
    dnes 05:22 | Bezpečnostní upozornění

    Byly publikovány informace o kritické zranitelnosti v knihovně pro Rust async-tar a jejích forcích tokio-tar, krata-tokio-tar a astral-tokio-tar. Jedná se o zranitelnost CVE-2025-62518 s CVSS 8.1. Nálezci je pojmenovali TARmageddon.

    Ladislav Hagara | Komentářů: 3
    včera 23:15 | Nová verze

    AlmaLinux přinese s verzí 10.1 podporu btrfs. XFS bude stále jako výchozí filesystém, ale instalátor nabídne i btrfs. Více informací naleznete v oficiálním oznámení.

    Max | Komentářů: 2
    včera 22:33 | IT novinky

    Společnost OpenAI představila svůj vlastní webový prohlížeč ChatGPT Atlas. Zatím je k dispozici pouze na macOS.

    Ladislav Hagara | Komentářů: 0
    včera 14:33 | Nová verze

    Desktopové prostředí KDE Plasma bylo vydáno ve verzi 6.5 (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ářů: 3
    včera 13:55 | IT novinky

    Rodina jednodeskových počítačů Orange Pi se rozrostla (𝕏) o Orange Pi 6 Plus.

    Ladislav Hagara | Komentářů: 6
    včera 13:33 | IT novinky

    Na Humble Bundle běží akce Humble Tech Book Bundle: All Things Raspberry Pi by Raspberry Pi Press. Se slevou lze koupit elektronické knihy od nakladatelství Raspberry Pi Press a podpořit Raspberry Pi Press, Raspberry Pi Foundation North America nebo Humble.

    Ladislav Hagara | Komentářů: 0
    včera 11:44 | Humor

    Přidaný režim autonomního řízení vozidel Tesla Mad Max je dostupný pro vybrané zákazníky v programu EAP (Early Access Program). Nový režim je na silnici agresivnější, častěji mění pruhy a ne vždy dodržuje rychlostní limity. Agentura JPP spekuluje, že v Česku by se mohl nový režim namísto Mad Max jmenovat Mad Turek...

    karkar | Komentářů: 24
    včera 04:00 | Nová verze

    Byla vydána nová verze 9.18 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Nově také pro NanoPi R3S, R3S LTS, R76S a M5. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    Jaké řešení používáte k vývoji / práci?
     (36%)
     (48%)
     (20%)
     (20%)
     (22%)
     (18%)
     (21%)
     (18%)
     (18%)
    Celkem 255 hlasů
     Komentářů: 14, poslední 14.10. 09:04
    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: 1112×
    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.