• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Menu w C, zabezpieczenie przed podaniem błędnej opcji

Object Storage Arubacloud
0 głosów
200 wizyt
pytanie zadane 7 kwietnia 2019 w C i C++ przez boniek Nowicjusz (190 p.)

Witam tworzę prosty program w C który musi się opierać na menu wyboru. Mniejsza z tym co kryje się pod funkcją Wykonaj() gdyż to teraz nie ma znaczenia. Program wyświetla proste menu i oczekuje od użytkownika jakiegoś wyboru, użytkownik podaje jakiego dokonuje wyboru z klawiatury.Problem w tym tkwi że chciałbym się zabezpieczyć przed tym gdyby użytkownik podał jakąś błędną opcję w menu. Gdy użytkownik poda np. "5" lub "6" wszystko jest okej, jednak podczas podania "a" lub "0,2" program się ciągle zapętla nie można nawet na spokojnie wpisać niczego. Czy ktoś wie jak rozwiązać ten problem ? Byłbym wdzięczny za pomoc. Pozdrawiam, życzę miłej niedzieli.

void Menu()
{
printf("1.Wybierz 1\n2.Wybierz 2\n3.Zakoncz\n");

int wybor;
int wymiar;
scanf("%d",&wybor);

if (wybor == 1)
{
    Wykonaj(1);
}
if (wybor == 2)
{
    Wykonaj(3);
}
if (wybor == 3)
{
    printf("Program zostanie zaraz zamkniety");
    exit(0);
}
if ((wybor!=1) || (wybor!=2)|| (wybor!=3))
{
    printf("Podales zly numer - nie ma takiej opcji ! Podaj numer jeszcze raz !\n\n");
    Menu();
}
}

int main()
{
Menu();
}

 

komentarz 7 kwietnia 2019 przez niezalogowany
while (1)
{
if (wybor == 1)
{
    Wykonaj(1); break;
}
if (wybor == 2)
{
    Wykonaj(3); break;
}
if (wybor == 3) break;
{
    printf("Program zostanie zaraz zamkniety");
    exit(0);
}
if ((wybor!=1) || (wybor!=2)|| (wybor!=3))
{
    printf("Podales zly numer - nie ma takiej opcji ! Podaj numer jeszcze raz !\n\n");
    Menu(); 
continue;
}
}

tylko nie wiem czy w c jest continue; while ale mi się wydaje że powinien być.

komentarz 8 kwietnia 2019 przez amelia.cpp Obywatel (1,860 p.)

@boniek, Jeżeli switch nie działa, możesz użyć if else. Chociaż u mnie switch działa bez zarzutu. Kod to przeanalizowania:

(zwróc uwagę na getchar())

void Menu()
{
printf("1.Wybierz 1\n2.Wybierz 2\n3.Zakoncz\n");
char wybor;
int wymiar;
scanf("%c", &wybor);

switch (wybor)
{
        case '1': Wykonaj(1); break;
        case '2': Wykonaj(2); break;
        case '3': printf("Program zostanie zaraz zamkniety"); exit(0); break;
        default: printf("Podales zly numer - nie ma takiej opcji ! Podaj numer jeszcze raz !\n\n"); getchar(); Menu(); break;
}
}
int main()
{
Menu();
return 0;
}

 

3 odpowiedzi

+2 głosów
odpowiedź 7 kwietnia 2019 przez niezalogowany
Zamiast if-ów daj switch i jako opcje domyślną daj wywołanie funkcji menu wtedy jeżeli nie będzie opcja 1 czy dwa to wyświetli się jeszcze raz menu.
komentarz 7 kwietnia 2019 przez boniek Nowicjusz (190 p.)
W sumie słuszny pomysł. Dzięki, tak też spróbuję ;) !
komentarz 7 kwietnia 2019 przez Secrus Nałogowiec (32,880 p.)
Tylko czy w C jest switch?
komentarz 7 kwietnia 2019 przez boniek Nowicjusz (190 p.)
Jest, jest. Akurat w tym menu to rozwiąże mój problem ale bardzo ciekawi mnie czy da się jakość zabezpieczyć by użytkownik nie mógł do zmiennej zadeklarowanej jako int wpisywać liter czy też innych specjalnych znaków, a tylko same cyfry.
komentarz 7 kwietnia 2019 przez boniek Nowicjusz (190 p.)

@12david12, Sprawdziłem i przy switchu program zachowuje sie tak samo :(

komentarz 7 kwietnia 2019 przez niezalogowany
#include <stdio.h>


void Wykonaj(int a) {
	printf("%d\n", a);
}

void Menu()
{
    printf("1.Wybierz 1\n2.Wybierz 2\n3.Zakoncz\n");
    char wybor;
    int wymiar;
    scanf("%c",&wybor);
    switch(wybor){
        case '1':
            Wykonaj(1);
            break;
        case '2':
            Wykonaj(2);
            break;
        case '3':
            Wykonaj(3);
            break;
        default:
            printf("Podales zly numer - nie ma takiej opcji ! Podaj numer jeszcze raz !\n\n");
            Menu();
    }
}
int main()
{
    Menu();
}

 

komentarz 7 kwietnia 2019 przez niezalogowany

@12david12 Proszę przeczytaj opis problemu.

komentarz 7 kwietnia 2019 przez niezalogowany
I u mnie się nie zapętla przy wprowadzaniu liter.
+1 głos
odpowiedź 7 kwietnia 2019 przez DeBos123 Nałogowiec (44,950 p.)

Spróbuj użyć switch'a:

#include <stdio.h>

void Menu()
{
    printf("1.Wybierz 1\n2.Wybierz 2\n3.Zakoncz\n");
    int wybor;
    int wymiar;
    scanf("%d",&wybor);
    switch(wybor){
        case 1:
            Wykonaj(1);
            break;
        case 2:
            Wykonaj(2);
            break;
        case 3:
            Wykonaj(3);
            break;
        default:
            printf("Podales zly numer - nie ma takiej opcji ! Podaj numer jeszcze raz !\n\n");
            Menu();
    }
}
int main()
{
    Menu();
}

 

komentarz 7 kwietnia 2019 przez niezalogowany

@DeBos123 Proszę przeczytaj opis problemu.

0 głosów
odpowiedź 8 kwietnia 2019 przez Provokator5 Początkujący (450 p.)
switch(wybor){
		case 1: Wykonaj(1); break;		
		case 2: Wykonaj(3); break;
		case 3: printf("Program zostanie zaraz zamkniety"); exit(0);
		
		default:
 				printf("Podales zly numer - nie ma takiej opcji ! Podaj numer jeszcze raz !\n\n");
				
				cin.clear();
				cin.ignore(100, '\n'); // Czysci bufor oraz zapobiega przed wykonaniem sie petli n-razy gdy wciścniesz n-liter
				//system("CLS"); <- Wyczyści ekran
				
				Menu();
	}

 

komentarz 8 kwietnia 2019 przez niezalogowany
To nie jest C

Podobne pytania

0 głosów
1 odpowiedź 471 wizyt
+1 głos
2 odpowiedzi 535 wizyt
0 głosów
3 odpowiedzi 425 wizyt
pytanie zadane 12 lipca 2015 w C i C++ przez Chejron Początkujący (270 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...