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



Teraz jest 6 gru 2021, o 15:09


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: 166
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: 166
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: 143
Pomógł: 35

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: 166
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: 70
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