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

Problem z wczytaniem wielu danych kilka razy C

Object Storage Arubacloud
0 głosów
120 wizyt
pytanie zadane 4 kwietnia 2018 w C i C++ przez Bartek Kotarski Początkujący (480 p.)

Witam

W programowaniu bardzo często mam problem z wczytywaniem wielu rzeczy pod rząd. Tworzę tablicę znaków char[], a następnie w pętli dodaję wczytywanie przez użytkownika do tej tablicy. W przykładzie, który zamieszczam użytkownik wprowadza imię (ono później przekazywane jest do kolejki), a następnie decyduje czy chce dodać kolejną osobę. Niestety za tym drugim razem (oraz każdym kolejnym) wyświetla się komunikat "wprowadź imię" po czym od razu bez możliwości wpisania czegokolwiek wyrzuca późniejszy komunikat "Czy chcesz dodać kolejną osobę ? Y/N", gdzie już jest możliwość dokonania wyboru. Problem więc jest w tym, że użytkownik nie może podać imienia. Myślę, że dzieje się tak ponieważ cały czas chce jakby nadpisywać ten sam łańcuch znaków, czy jest jakieś rozwiązanie ? 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

#define ILOSC 100

struct kolejka
{
    int id;
    char imie[ILOSC];
    struct kolejka *next;
};
struct wskazniki
{
    struct kolejka *head,*tail;
};

void dodaj(struct wskazniki *fifo,int id, char *imie,int dlugosc)
{
    struct kolejka *new_kolejka = (struct kolejka*)malloc(sizeof(struct kolejka));
    int i=0;
    if(new_kolejka)
    {
        new_kolejka->id = id;
        for(i = 0;i < dlugosc;i++)
        {
            new_kolejka->imie[i] = imie[i];
        }
        new_kolejka->imie[dlugosc] = '\0';
        new_kolejka->next = NULL;
        if(fifo->head == NULL)
        {
            fifo->head = fifo->tail = new_kolejka;
        }else
        {
            fifo->tail->next = new_kolejka;
            fifo->tail = new_kolejka;//fifo->tail=fifo->tail->next;

        }

    }
}

int main()
{
    struct wskazniki fifo = {NULL,NULL};
    char imie[ILOSC];
    int i,dlugosc;
    char wybor;

    do
    {
        puts("Wprowadz imie");
        fgets(imie,ILOSC,stdin);
        dlugosc=strlen(imie);
        dodaj(&fifo,i,imie,dlugosc-1);
        i++;
        printf("Czy chcesz dodac kolejna osobe ? Y/N\n");
        wybor = getchar();
        system("cls");
    }while(wybor == 'Y');




    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 4 kwietnia 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
Dzieje się tak, bo getchar pobiera tylko jeden znak ze strumienia. W strumieniu zostaje jeszcze znak nowej linii '\n', który zostanie w następnej iteracji wczytany przez fgets. Trzeba się tego znaku po prostu pozbyć przed wywołaniem fgets. To, że wczytujesz do tej samej tablicy nie ma nic do rzeczy.

Podobne pytania

0 głosów
1 odpowiedź 313 wizyt
0 głosów
2 odpowiedzi 134 wizyt
0 głosów
1 odpowiedź 564 wizyt

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!

...