Ako obmedzit pisanie znakov v C

Sekcia: Programovanie 16.12.2010 | 17:26
Avatar armis   Používateľ
Zdravim, potreboval by som obmedziť v C, v programe na šifrovanie, písanie znakov len na znaky abecedy, číslic a medzeru.
Najlepšie tak aby ich uzivateľ nemohol ani zadať a program pri šifrovani použiť, dá sa to nejako nastaviť?



    • Re: Ako obmedzit pisanie znakov v C 16.12.2010 | 19:58
      Avatar Fridolín Pokorný Fedora 21  Používateľ
      Asi hladas makra z ctype.h?!
      Skus blizsie specifikovat, co si predstavujes pod "zadat" a "pouzit".
      • Re: Ako obmedzit pisanie znakov v C 16.12.2010 | 20:14
        Avatar armis   Používateľ
        OK mam tento program na sifrovanie, desifrovanie. Ide o to ze pouziva vsetky znaky z ANSICII, portebujem aby pouzival iba abecedu a cisla, a to na sifrovanie, takze aby vyplul zase len cila a abecedu.
        made by Armis
        #include <stdio.h>

        void sifra(int posun); /*Deklaracia a definicia premennych*/
        void desifra (int posun);
        void program (int posun, int sifrovanie);

        int main()
        {
        char c;
        int posun, prem, sifrovanie;


        do
        {
        printf("Zadaj hodnotu posunu: ");
        scanf("%d", &prem);
        if (prem < 0) printf("Zla hodnota, zadaj nezapornu hodnotu!!!\n");
        }while (prem < 0); /*ak premenna je zaporne cislo opakuje cyklus*/


        do{
        posun = prem; /*do poun prirad premennu. Premenna sluzi na zapametanie zakladnej hodnoty*/
        program (posun, sifrovanie); /*Volanie funkcie program*/
        printf ("Stlacte bodku pre ukoncenie programu.\n");
        c = getchar ();
        putchar (c);
        }while(c != '.'); /*Program sa spusti od zaciatku ak zadana znak nieje botka*/
        return 0;

        }

        void sifra(int posun)
        {
        char p;
        printf("Zadaj text: ");
        p = getchar();
        while(p != '\n')
        {
        if (p == ' ')
        putchar(p);
        putchar(p + posun);
        p = getchar();
        }
        putchar(p);
        }

        void desifra(int posun)
        {
        char p;
        printf("Zadaj text: ");
        p = getchar();
        while(p != '\n')
        {
        if (p == ' ')
        putchar(p);
        putchar(p - posun);
        p = getchar();
        }
        putchar(p);
        }

        void program (int posun, int sifrovanie)
        {




        do
        {
        printf("Stlac 1 pre zasifrovanie, 0 pre odsifrovanie: ");
        scanf("%d", &sifrovanie);
        if (sifrovanie != 0 && sifrovanie !=1)
        printf("Zla hodnota.\n");
        }while (sifrovanie != 0 && sifrovanie !=1); /*ak zadane udaje niesu 0 alebo 1 opakuje cyklus*/

        if(getchar() != '\n');
        if (sifrovanie == 1)
        sifra(posun); /*Volanie funkice sifrovania*/
        else desifra(posun); /*Volanie funkcie desifrovania*/

        }
        • Re: Ako obmedzit pisanie znakov v C 16.12.2010 | 20:25
          Avatar Fridolín Pokorný Fedora 21  Používateľ
          http://en.wikipedia.org/wiki/ASCII

          Skus sa pozriet, ako taka ASCII tabulka vyzera. Asi chces osetrit, ked sa dostanes mimo interval tisknutelnych znakov.
          • Re: Ako obmedzit pisanie znakov v C 16.12.2010 | 20:31
            Avatar armis   Používateľ
            no presne to chcem. Lenze som taka lama ze fakt nemam sajnu ako.
            Pri mojom prvom pokuse som chcel definovat znaky do pola, nech pouziva len tie co urcim ja a v pripade konca volenych znakov nech zacne odznova (osetrene pointerom).
            Lenze vtedy som pouzival na porovnavanie znakov switch a definoval kazdu jednu hodnotu co nebolo najstastnejsie riesenie.
            • Re: Ako obmedzit pisanie znakov v C 16.12.2010 | 20:35
              Avatar Fridolín Pokorný Fedora 21  Používateľ
              Ach.. Pozrel si sa na tu tabulku? Co je to ASCII?

              ((znak+posun)%('~'-'!'+1))+'!'
              • Re: Ako obmedzit pisanie znakov v C 16.12.2010 | 20:58
                Avatar armis   Používateľ
                Ano pozrel, skusil som cosi mi poradil, lenze ked zadefinujem aby nepouzival tieto znaky dostane sa k sipkam hore dole doprava dolava adt. Takze nakoniec by som musel zadefinovať všetky znaky v symboloch. Neda sa to spravit opacne ?
                Ze budem definovat len tie ktore ma poznat?
                A este nez sa k tomu dostaneme ano som sudent, ano je so seminarka, ano chem programovat aj dalej, ibaze moje terajsie vedomosti na to nestacia.
                • Re: Ako obmedzit pisanie znakov v C 16.12.2010 | 21:11
                  Avatar Fridolín Pokorný Fedora 21  Používateľ
                  Ake sipky?
                  Ten vyraz, co som uviedol vrati ASCII hodnotu vzdy taku, aby dany znak bol od znaku ! po znak ~.
                  • Re: Ako obmedzit pisanie znakov v C 16.12.2010 | 21:32
                    Avatar armis   Používateľ
                    No ok, upravil som to na ((znak+posun)%('a'-'x'+1))+'x'
                    dal som zasifrovat abcdefg
                    vyplulo to ♫☼►
                    • Re: Ako obmedzit pisanie znakov v C 16.12.2010 | 21:51
                      Avatar Fridolín Pokorný Fedora 21  Používateľ
                      Pozri sa pls na tu tabulku a ciselnu reprezentaciu jednotlivych znakov este raz. Mozno si mal na mysli ((znak+posun)%('x'-'a'+1))+'a', co zobrazi kazdy znak do znakov a az x v tabulke. (A taketo "sifrovanie" asi nechces. Budes mat nejednoznacne urcenie povodneho znaku, kedze mozes mat znak A, a, [, \, ! a pod...)
                      • Re: Ako obmedzit pisanie znakov v C 16.12.2010 | 22:31
                        Avatar armis   Používateľ
                        Mne presne ide o to aby vedel definovat len pismena a cisla ide o to ze to ma byt program na caesarovu sifru.
                        A v originalnej sifre ostatne znaky nepouzivaly (sice ani cisla ale toto male rozsirenie mi odpustia, hadam.)

                        este pre kontrolu putchar((znak+posun)%('x'-'a'+1))+'a'; a malo by pouzivat len tieto male pismena?
                        Lebo som fakt s toho magor. Viem ANSCII ma presne definovanu postupnost znakov, no aj tak mi to vypisuje blbosti.
                        Celu tabulku som nastudoval, skusil som co viem, co si radil, ale aj tak sa s nim neviem dohodnut. :-/
                        • Re: Ako obmedzit pisanie znakov v C 16.12.2010 | 22:38
                          Avatar Fridolín Pokorný Fedora 21  Používateľ
                          Ak to chces ciste obmedzit len na a-z, A-Z, a 0-9, tak aplikuj nieco podobne na to, co sme tu uz rozoberali. Je viacej sposobov, ako to je mozne spravit. Maj vsak na pamati, aby si dostal to iste aj pri desifrovani.

                          Mozno ako zaciatok si skus zobrat ceruzku a papier. Na lavu stranu si napis vsupne znaky a na pravu stranu vystupne, tak aby prisluchali. Nakoniec zistis ako to chces prevadzat podla ASCII hodnoty jednotlivych znakov. Ak to chces nejak zbesilo, mozes si definovat napr nejaku tabulku a pomocou znaku do nej indexovat a tak ziskat vysledny znak.

                          Inac ta tabulka sa vola ASCII.