Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 4 kwi 2025, o 07:06


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
    Autor Wiadomość
    PostNapisane: 23 paź 2021, o 16:04 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 17 lip 2013
    Posty: 208
    Lokalizacja: Kielce
    Pomógł: 15

    Witam

    Panowie, w programie użytkownik proszony jest o wprowadzenie kolejno trzech liczb. Jak zabezpieczyć program przed wpisaniem przez użytkownika litery?

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 paź 2021, o 17:46 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 sty 2013
    Posty: 169
    Lokalizacja: Silesia - P-ce
    Pomógł: 10

    Wg mnie najprościej sprawdzać czy zakres każdego znaku mieści się w określonych granicach, w tym przypadku cyfrach 0-9 (albo wg ASCI od 0x30 do 0x39).
    Pętla i warunek sprawdzający.

    Np.:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    albo

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Autor postu otrzymał pochwałę

    _________________
    Niewiele trzeba by być szczęślwym.Wystarczy chcieć



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 paź 2021, o 17:59 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 17 lip 2013
    Posty: 208
    Lokalizacja: Kielce
    Pomógł: 15

    danielos napisał(a):
    Wg mnie najprościej sprawdzać czy zakres każdego znaku mieści się w określonych granicach, w tym przypadku cyfrach 0-9 (albo wg ASCI od 0x30 do 0x39).
    Pętla i warunek sprawdzający.

    Np.:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    albo

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    Dzięki, zadziała dla pojedyńczych cyfr 0-9. Pozostaje kwestia liczb całkowitych, ktore powinien pozwolić wpisać.

    Genaralnie ma w zalezności od 3 podanej wartości (od 1 do 3) sumować, odejmować lub mnożyć dwie pierwsze podane liczby.
    Jest to zrobione, pozostaje mi tylko zabepieczenie programu.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 paź 2021, o 18:53 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 sty 2013
    Posty: 169
    Lokalizacja: Silesia - P-ce
    Pomógł: 10

    Pomyślmy razem:
    - Gdzie zapisywane są wpisane znaki?
    - Do zmiennej, która jest tabelą, a nazwa jej to tab.
    - Więc jak sprawdzić pierwszy element, czy wpisana jest cyfra?
    - No tak jak zostało podane używając tab[0].
    - A jak sprawdzić dla, np 3 znaku?
    - Wpisując tab[2].

    -Czyli co trzeba zrobić aby sprawdzić dla całego tekstu czy są same cyfry?
    -Sprawdzić każdą komórkę zmiennej tab.

    Reasumując musisz sprawdzić jaka jest długość wpisanego tekstu i na podstawie tej wartości tyle razy skontrolować czy dany znak to cyfra.
    Np.:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    _________________
    Niewiele trzeba by być szczęślwym.Wystarczy chcieć



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 paź 2021, o 19:58 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 29 lis 2019
    Posty: 145
    Pomógł: 37

    danielos napisał(a):
    Wg mnie najprościej sprawdzać czy zakres każdego znaku mieści się w określonych granicach, w tym przypadku cyfrach 0-9 (albo wg ASCI od 0x30 do 0x39).


    Biblioteka standardowa (plik nagłówkowy ctype.h) dostarcza grupę funkcji testujących znak.

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Testowanie funkcją isdgit jest wygodne gdy mamy strumień znaków. W przypadku gdy wczytywanie znaków odbywa sie funkcją scanf nie jest to zbyt wygodne. Funkcja scanf jest buforowana a więc odczytanie znaków następuje po naciśnięciu entera. A więc można by wczytywać ciąg znaków jak leci jako string (ponieważ funkcja scanf nie "wywali się" po napotkaniu znaku niezgodnego ze wzorcem), a nastepnie testować wczytane znaki na okoliczność wystąpienia innego znaku niż cyfra. W razie wystąpienia takiego znaku całośc jest odrzucana, w razie braku ciąg można przerobić na liczbę. I tu znów pomocą służ biblioteka standardowa.

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    ------------------------ [ Dodano po: 40 minutach ]

    No i mamy piękny okaz przepełnienia bufora :lol: Trzeba się zabezpieczyć ograniczając liczbę znaków odczytanych z wejścia.
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Oczywiście należy także przewidzieć w buforze miejsce na końcowy null.
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Autor postu otrzymał pochwałę

    _________________
    Think for yourself and question authority.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 paź 2021, o 21:21 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 sty 2013
    Posty: 169
    Lokalizacja: Silesia - P-ce
    Pomógł: 10

    fofex napisał(a):
    Biblioteka standardowa (plik nagłówkowy ctype.h) dostarcza grupę funkcji testujących znak.


    Oooo i też się czegoś nauczyłem. Dzięki, przyda się.

    _________________
    Niewiele trzeba by być szczęślwym.Wystarczy chcieć



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 paź 2021, o 23:07 
    Offline
    Użytkownik

    Dołączył(a): 09 paź 2016
    Posty: 71
    Lokalizacja: Olsztyn
    Pomógł: 1

    Jest też inny sposób.
    A. ograniczenie długości wpisywanej liczby można już w samym specyfikatorze np. %5d - pięć cyfr.
    Inny sposób to zamiana tablicy na zmienną:

    int/uintx_t wart1, wart2;

    i odczyt:
    scanf("%d", &wart1);
    scanf("%d", &wart2);

    B. funkcja scanf() zwraca wartość 1, jeśli wprowadzona dana jest zgodna ze specyfikatorem, a 0 jeśli niezgodna.
    zapis:
    if(scanf("%d", wart1)=!1)
    i tu np. stosowny komunikat.


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO