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

wypisywanie dynamicznej tablicy charów

Object Storage Arubacloud
0 głosów
283 wizyt
pytanie zadane 17 grudnia 2022 w C i C++ przez Stahious Nowicjusz (150 p.)

Hej, mam do napisania program który będzie wczytywał z klawiatury chary i dodawał je do dynamicznej tablicy. Wygląda on tak:

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

char *add(char *tab, int n, char newElement)
{
    char *newTab;
    newTab = malloc((n+1)*sizeof(*newTab));

    if(newTab == NULL)
        return NULL;

    //przepisanie tablicy
    for(int i=0; i<n; i++)
    {
        newTab[i] = tab[i];
    }
    
    newTab[n] = newElement;
    free(tab);

    return newTab;
}

int main()
{
    char *tab = NULL;
    int size = 0;
    char znak;

    scanf("%c", &znak);
    while(znak != '.')
    {
        tab = add(tab, size, znak);
        size++;
        scanf("%c", &znak);
    }

    for(int i=0; i<size; i++)
    {
        printf("%c", tab[i]);

    }

    free(tab);
    return 0;
}

Tyle że każdy znak wypisuje się w nowej linijce (chciałbym żeby wypisywał się w jednej). Co ciekawe to jeżeli tablica będzie z intami to wszystko działa tak jak powinno. Proszę o pomoc bo totalnie nie rozumiem co ma typ zmiennej do jej sposobu wypisania ;))

1 odpowiedź

+1 głos
odpowiedź 17 grudnia 2022 przez Gynvael Coldwind Nałogowiec (27,530 p.)
wybrane 17 grudnia 2022 przez Stahious
 
Najlepsza

Patrząc na kod wyszło mi, że wypisuje się dobrze, a problemem jest raczej to jak testujesz. Tj. na oko testujesz to tak:

a
s
d
f
.

Czyli znaki które podajesz to: 'a', znak nowej linii, 's', znak nowej linii, 'd', znak nowej linii, 'f', znak nowej linii, kropka. Więc ostatecznie tablica znaków ma 8 znaków, które, jak wypisujesz, dają:

a
s
d
f

Co jest poprawnym wynikiem.

Spróbuj to przetestować tak:

asdf.

I zobacz co wtedy Ci wyjdzie.

A btw, i poczytaj o funkcji realloc, bardzo by uprościła Ci życie. I pewnie o null-byte też - jak byś go używał, to ostateczne wypisanie sprowadziło by się do puts(tab) zamiast pętli ;)

komentarz 17 grudnia 2022 przez Stahious Nowicjusz (150 p.)
O kurde, nie pomyślałem że enter też jest traktowany jako znak. To by wyjaśniało różnice w działaniu z intami. Zastanawia mnie też dlaczego po napisaniu kilku znaków jednocześnie ("asdf") wszystkie są wpisywane w inne miejsce tablicy, scanf nie powinien po prostu popatrzeć na pierwszy a resztę uciąć?

Dzięki bardzo za sugestie, tutaj akurat realloca nie użyłem bo tak miałem w treści zadania ;), ale resztę koniecznie sprawdzę.

A no i dzięki bardzo za pomoc, strasznie długo nad tym siedziałem i nie mogłem wykminić ;)))
1
komentarz 17 grudnia 2022 przez Gynvael Coldwind Nałogowiec (27,530 p.)

W dużym skrócie wszystko co wpiszesz jest dodawane do "strumienia" danych zwanego standardowym wejściem. scanf (jak i inne podobne funkcje) potem z niego wczytują tak długo jak to wynika ze specyfiki ich działania. To czego nie wczytają zostaje w strumieniu do odczytania w przyszłości. Więc jeśli scanf("%c") nie wczyta czegoś (bo wczyta tylko jeden znak), to kolejny scanf("%c") to chwyci (tj. chwyci kolejny znak).

Jeśli więc wpiszesz "asdf.<ENTER>", to (z uwagi na domyślne buforowanie danych w konsoli do naciśnięcia enteru) na standardowym wyjściu pojawi się naraz "asdf.\n", i kolejne scanf("%c) po kolei znak po znaku sobie to odczytają :)

Jeśli natomiast celowo chciałbyś usunąć znaki ze standardowego wejścia to... w zasadzie najłatwiej i najbardziej przenośnie jest je po prostu odczytać i zignorować. Są czasem metody, np. fpurge(), ale ich działanie jest najeżone problemami, więc w praktyce się tego nie stosuje.

komentarz 18 grudnia 2022 przez Stahious Nowicjusz (150 p.)
Super, dzięki piękne za wyjaśnienie!
komentarz 18 grudnia 2022 przez j23 Mędrzec (194,920 p.)

Użycie realloc uprości sprawę.

Podobne pytania

0 głosów
1 odpowiedź 422 wizyt
pytanie zadane 5 kwietnia 2020 w C i C++ przez MaTiDxxx Początkujący (290 p.)
0 głosów
3 odpowiedzi 2,538 wizyt
pytanie zadane 31 lipca 2018 w C i C++ przez Ptaszor3 Użytkownik (900 p.)
0 głosów
2 odpowiedzi 1,827 wizyt
pytanie zadane 24 listopada 2017 w C i C++ przez panstudent Nowicjusz (190 p.)

92,556 zapytań

141,404 odpowiedzi

319,562 komentarzy

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

...