Podwójnie wykonująca się pętla

0

Witam serdecznie, nie rozumiem dlaczego ta pętla wykonuje mi się 2 razy to znaczy za każdym razem wypisuje wszystkie dane dwukrotnie przed pobraniem w scanfem

while (i < size)
    {
        printf("podaj jaką opcje wybierasz \n");
        printf("a --- utwórz strukture pod wybranym indeksem \n");
        printf("p --- wypisz wszystkie dane z tablicy \n");
        printf("c --- utworz potomkow na bazie osoby \n");
        scanf("%c", &w);
        switch (w)
        {
        case 'a':

            break;
        case 'c':

            zrobPotomka(&osoby, size-1);

            break;
        case 'p':
            break;
        }
        i++;
    }

dodaje cay kod https://onlinegdb.com/rkv1C2IJN

1

Przygotuj MCVE, to co zamieściłeś wygląda ok.

Poza tym, formatuj kod :​(

1
int size,i=0;
     int idx,idxArray[size];

Inicjuj zmienne przed użyciem (size).

Wypisuje podwójnie bo po pierwszym scanfi'e pozostaje znak 0x0a w buforze.

I to menu...

           while (i < size)
    {
           ...    //wybierz coś z menu
              i++;
    }

... raczej nie zadziała tak jak oczekujesz.

2

scanf() zostawia po pytaniu o ilość osób utworzonych na dzień dobry śmieć w postaci znaku nowej linii, co powoduje, że drugi scanf w pętli while z marszu go czyta, i nie wstrzymuje wykonywania pętli. Oto dowód na prawdziwość teorii:

int main()
{
    struct Person** osoby;

    int size,i=0;
    int idx,idxArray[size];
    // printf("podaj ile chcesz stworzyc osob");

    // scanf("%d", &size);
    // osoby = (struct Person*) malloc(size * sizeof(struct Person));

    //wykomentowałem pierwszego scanf-a, dałem zahardkodowany size na 2 i voila - nie ma wyświetlania 2x     
    char w = '0';
    size = 2;
    while (i < size)
    {
        printf("podaj jaką opcje wybierasz \n");
        printf("a --- utwórz strukture pod wybranym indeksem \n");
        printf("p --- wypisz wszystkie dane z tablicy \n");
        printf("c --- utworz potomkow na bazie osoby \n");        
        scanf("%c", &w);

        switch (w)
        {
            case 'a':
               break;

            case 'c':
                zrobPotomka(&osoby, size-1);
                break;

            case 'p':
                break;
        }
        i++;
    }

    return 0;
}

to teraz góglujesz sobie Bracie @The Best "how to remove \n left by scanf", i dopisujesz sobie rozwiązanie co ci znajdzie do swojego programu.

2

No dobra, kolejna podpowiedź - olej scanf(), zamiast niego uźywaj getchar() + poszukiwanie '\n' którym wyjmiesz ze stdin pozostawiony tam znak nowej linii.

0

teraz mam problem przy tworzeniu drugiego usera czy wypisywaniu danych, przy tworzeniu wysypuje się a przy wypisywaniu podaje dziwne dane ,tylko dobre nazwisko jest https://onlinegdb.com/Hy0LKZwk4

1

Zobacz uwagi z mojego poprzedniego posta (niezainicjowane zmienne).
Plus:

  • jak używać tablic w funkcji scanf() (kiedy pisać '&').
  • jak otrzymać długość ciągu znaków (czemu sizeof(tab)/sizeof(tab[0]) tu nie zadziała).

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0