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 18:55 | Nová verze

Byla vydána verze 2017.1 linuxové distribuce navržené pro digitální forenzní analýzu a penetrační testování Kali Linux. S vydáním verze 2016.1 se Kali Linux stal průběžně aktualizovanou distribucí. Aktualizovat jej lze pomocí příkazů "apt update; apt dist-upgrade; reboot".

Ladislav Hagara | Komentářů: 0
dnes 18:22 | Nová verze

Po téměř pěti letech od vydání verze 2.00 byla vydána nová stabilní verze 2.02 systémového zavaděče GNU GRUB (GRand Unified Bootloader). Přehled novinek v souboru NEWS.

Ladislav Hagara | Komentářů: 1
dnes 17:55 | Komunita

Vývojáři Debianu oznámili, že od 1. listopadu letošního roku nebudou jejich archivy dostupné pomocí protokolu FTP. Již v lednu oznámil ukončení podpory FTP kernel.org (The Linux Kernel Archives).

Ladislav Hagara | Komentářů: 0
dnes 17:00 | Bezpečnostní upozornění

V oblíbeném webmailu postaveném na PHP SquirrelMail (Wikipedie) byla nalezena bezpečnostní chyba CVE-2017-7692, jež může být útočníkem zneužita ke spuštění libovolných příkazů a kompletnímu ovládnutí dotčeného serveru. Zranitelnost se týká pouze instancí, kde je pro transport používán Sendmail.

Ladislav Hagara | Komentářů: 1
dnes 13:11 | Zajímavý článek

Soudní dvůr Evropské unie rozhodl (tisková zpráva) ve věci C-527/15: Prodej multimediálního přehrávače, který umožňuje zdarma a jednoduše shlédnout na televizní obrazovce filmy protiprávně zpřístupněné na internetu, může představovat porušení autorského práva.

Ladislav Hagara | Komentářů: 14
včera 13:33 | Pozvánky

Byly stanoveny termíny konferencí LinuxDays 2017 a OpenAlt 2017. Letošní LinuxDays proběhne o víkendu 7. a 8. října v Praze v Dejvicích v prostorách FIT ČVUT. Letošní OpenAlt proběhne o víkendu 4. a 5. listopadu na FIT VUT v Brně.

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

Jiří Eischmann z desktopového týmu Red Hatu se v příspěvku Linuxový desktop: Co vám chybí na svém blogu ptá, co uživatele na Fedora Workstation a na linuxovém desktopu obecně trápí a co by desktopový tým mohl zlepšit. Pokud máte nějaké podněty, napište mu je do komentářů.

Ladislav Hagara | Komentářů: 70
včera 03:33 | Nová verze

Byla vydána nová verze 0.25.0 multimediálního přehrávače mpv (Wikipedie) vycházejícího z přehrávačů MPlayer a mplayer2. Z novinek lze zmínit například podporu DVB-T2. Další části mpv byly přelicencovány z GPLv2 nebo novější na LGPLv2.1 nebo novější (#2033).

Ladislav Hagara | Komentářů: 0
včera 02:22 | Zajímavý projekt

Na Bundle Stars byla spuštěna akce Dollar Forever Bundle. Za 1 dolar lze získat 24 počítačových her bežících na platformě Steam také v Linuxu.

Ladislav Hagara | Komentářů: 2
24.4. 23:44 | Zajímavý software

Lychee je jedním z open source softwarů pro tvorbu webových fotoalb. Vyžadováno je PHP 5.5 nebo novější a MySQL. Ukázka na stránkách projektu. Zdrojové kódy jsou k dispozici na GitHubu pod open source licencí MIT [reddit].

Ladislav Hagara | Komentářů: 6
Chystáte se pořídit CPU AMD Ryzen?
 (4%)
 (34%)
 (1%)
 (6%)
 (45%)
 (10%)
Celkem 309 hlasů
 Komentářů: 45, poslední dnes 18:25
    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: 974×
    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.