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

instrukcja switch w niekonczącej pętli wyłacza program

Object Storage Arubacloud
+1 głos
517 wizyt
pytanie zadane 9 lutego 2022 w C i C++ przez Dynamic Bywalec (2,910 p.)
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int A, B, dz;
    for(;;)
    {
        printf(" KALKULATOR \n");
        printf(" 1. dodwanie \n");
        printf(" 2. odejmowanie \n");
        printf(" 3. historia \n");
        printf(" co chcesz policzyc: ");
        scanf("%d", &dz);
        switch (dz) {
            case 1:
            {
                printf("Podaj A: ");
                scanf("%d", &A);
                printf(" Podaj B: ");
                scanf("%d", &B);

            }break;
            case 2:
            {
                printf("Podaj A: ");
                scanf("%d", &A);
                printf(" Podaj B: ");
                scanf("%d", &B);
            }break;
            case 3:
            {
                int h;
                printf(" HISTORIA \n");
                printf(" 1. wypisz. \n");
                printf(" 2. zapisz do pliku. \n");
                printf(" co chcesz zrobic z historia: ");
                scanf("%d", &h);
                switch (h)
                {
                    case 10: {

                    }
                    break;
                    case 11: {

                    }
                        break;
                    case 12: {

                    } break;
                    case 13: {

                    } break;
                    case 14: {

                    } break;
                    
                    default: {
                        printf(" nie prawidlowe dzialanie ");
                    }
                }
            }break;
            default:
            {
                printf(" Brak dzialania ");
            }break;
        }
    }
}

witam, napisałem taki program, problem w tym, że po którymś użyciu opcji program po prostu się kończy po wpisaniu A i B. myslalem nad tym, że może scanf wczytuje znak końca linii. ale nie wiem jak to zlikwidować. dzięki za pomoc. 

komentarz 10 lutego 2022 przez Oscar Nałogowiec (29,290 p.)

scanf z formatem %d najpierw pomija wszystkie białe znaki (więc nowe linie też) a potem czyta cyferki aż napotka coś co nie jest cyfrą. Jeśli pierwszym nie-białym znakiem nie będzie cyfra kończy z błedem. Wynikiem scanf jest liczba poprawnie obsłużonych formatów - w tym przypadku zawsze 1 będzie oznaczać poprawne wczytanie liczby.

1 odpowiedź

0 głosów
odpowiedź 10 lutego 2022 przez VBService Ekspert (253,300 p.)
edycja 10 lutego 2022 przez VBService

Masz błąd w linii 67, w switch po default nie "daje się" break, przy takim zapisie powoduje break z for (;;) wink

 

P.S.1 

 

P.S.2

w switch używa się break po case, możliwy jest i taki zapis

przykład  [ on-line ]

#include <stdio.h>

int main()
{
    while(1)
    {
        int month = 0;
        printf("Podaj numer miesiaca: ");
        scanf("%d", &month);
        
        switch (month)
        {
            case 12:
            case 1:
            case 2:
                printf("Zima");
            break;
            case 3:
            case 4:
            case 5:        
                printf("Wiosna");
            break;
            case 6:
            case 7:
            case 8:        
                printf("Lato");
            break;
            case 9:
            case 10:
            case 11:        
                printf("Jesien");
            break;
            default:
                printf("Nieprawidlowy numer miesiaca");
        }
        
        int one_more_time = 2;
        printf("\n\nPonowic? [1] - tak, [2] - nie: ");
        scanf("%d", &one_more_time);
        
        if (one_more_time == 2) break;
    }

    return 0;
}

 

komentarz 10 lutego 2022 przez Oscar Nałogowiec (29,290 p.)
edycja 10 lutego 2022 przez Oscar

Z tym breakiem to nie są jakieś żelazne zasady i break po default nie jest błędem i nie powoduje zakończenia pętli. Jeśli jest wewnątrz { } w switch (i nie w jakiejs wewnnętrznej pętli ani drugiego switcha) powoduje wyjście z instrukcji switch. Brak break na końcu bloku po prostu powoduje przejście pod następny case,  Sam to czasami stosuje jednak zawsze w takim przypadku daje komentarz, że to celowe. Stąd serie case-ów to nie jakiś specjalnmy przypadek, a po prostu brak break.

Po ostatniej etykiecie (obojętnie czy to case czy default) instrukcja break jest po prostu bez znaczenia.

 

Podobne pytania

0 głosów
3 odpowiedzi 178 wizyt
pytanie zadane 13 grudnia 2019 w C i C++ przez amtrax Dyskutant (9,630 p.)
0 głosów
0 odpowiedzi 993 wizyt
pytanie zadane 1 listopada 2019 w C i C++ przez Hubertius Bywalec (2,970 p.)
+3 głosów
1 odpowiedź 366 wizyt
pytanie zadane 22 października 2021 w C i C++ przez CrisGoldmann Nowicjusz (200 p.)

92,568 zapytań

141,420 odpowiedzi

319,622 komentarzy

61,954 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!

...