• 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

VPS Starter Arubacloud
+1 głos
697 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,340 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 (255,840 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,340 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 201 wizyt
pytanie zadane 13 grudnia 2019 w C i C++ przez amtrax Dyskutant (9,630 p.)
0 głosów
0 odpowiedzi 1,099 wizyt
pytanie zadane 1 listopada 2019 w C i C++ przez Hubertius Bywalec (2,970 p.)
+3 głosów
1 odpowiedź 521 wizyt
pytanie zadane 22 października 2021 w C i C++ przez CrisGoldmann Nowicjusz (200 p.)

93,015 zapytań

141,978 odpowiedzi

321,271 komentarzy

62,358 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...