Podwójnie wykonująca się pętla

Odpowiedz Nowy wątek
2018-12-06 16:20
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

edytowany 1x, ostatnio: The Best, 2018-12-06 16:41

Pozostało 580 znaków

2018-12-06 16:26
kq
1

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

Poza tym, formatuj kod :​(


Pokaż pozostałe 17 komentarzy
Uhhh którego? - kq 2018-12-06 16:59
krzaq formater - MasterBLB 2018-12-06 17:19
W jaki sposób jestem zdegenerowanym dżawowcem? :​( - kq 2018-12-06 17:20
Nie wiem czy jesteś, choć z 2 mańki doradzasz używanie narzędzia nieprawilnie stawiającego nawiasy {} ;) - MasterBLB 2018-12-06 17:22
Masz tam kilka styli do wyboru. Zresztą: prawie dowolny styl, byle konsekwentny, jest lepszy od losowych indentacji. - kq 2018-12-06 17:25

Pozostało 580 znaków

2018-12-06 17:17
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.

Pozostało 580 znaków

2018-12-06 17:18

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.


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]

Pozostało 580 znaków

2018-12-06 21:33
2

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


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
zrobiłem to ze scnafem, dzięki twojej podpowiedzi po prostu dałem spacje przed " %s" i działa - The Best 2018-12-06 21:34

Pozostało 580 znaków

2018-12-06 21:42
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

Pokaż pozostałe 7 komentarzy
najwidoczniej nie. Postaw pułapkę debuggera na tym przypisaniu, i jak się zatrzyma to sprawdź co zawiera age. - MasterBLB 2018-12-06 22:51
Bracie, co to pułapka debuggera, czy to jakaś tajna funkcja ? - The Best 2018-12-06 22:58
chodzi po prostu o breakpointa ? Nie znałem terminologii pułapki :P - The Best 2018-12-06 23:02
tak, o breakpointa chodzi. - MasterBLB 2018-12-06 23:05

Pozostało 580 znaków

2018-12-06 23:09
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).

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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

Robot: CCBot (2x)