Problemy z dynamiczną alokacją pamięci, bardzo proszę o pomoc

0

Czy mógłby mi ktoś pomóc to zrozumieć, program w domyśle ma dynamicznie alokować dodatkową pamięć. W teorii działa poprawnie, ale nie rozumiem szczegółów, takich jak czemu dwa razy printuje mi "Podaj znak o indeksie" no i czemu wynik jest w linijkach pod spodem jeśli nie używam w printcie \n????
Z góry bardzo dziękuje za pomoc

#include <stdio.h>
#include <stdlib.h>
#define ROZ 2

int main()
{
    char *napis;
    int n=0;
    char a;

    napis=calloc(ROZ,sizeof(char));
    printf("Witam w programie, który dynamicznie wpisuje znaki do tablicy!\n");

    do
    {

     printf("Podaj znak o indeksie %d\n",n);
     scanf("%c",&a);


     if(n<ROZ)
     {
        napis[n]=a;
     }
     else if(n>=ROZ)
     {
         napis=realloc(napis,(n+1)*sizeof(char));
         napis[n]=a;
     }
     n++;

    }while(a!='.');

         napis=realloc(napis,(n+1)*sizeof(char));
         napis[n]='\0';

   printf("|");
   for(n=0;napis[n]!='\0';n++)
   {
       printf("%c|", napis[n]);
   }
    return 0;
}

I taki jest efekt:

Witam w programie, ktory dynamicznie wpisuje znaki do tablicy!
Podaj znak o indeksie 0
q
Podaj znak o indeksie 1
Podaj znak o indeksie 2
w
Podaj znak o indeksie 3
Podaj znak o indeksie 4
e
Podaj znak o indeksie 5
Podaj znak o indeksie 6
r
Podaj znak o indeksie 7
Podaj znak o indeksie 8
t
Podaj znak o indeksie 9
Podaj znak o indeksie 10
y
Podaj znak o indeksie 11
Podaj znak o indeksie 12
u
Podaj znak o indeksie 13
Podaj znak o indeksie 14
i
Podaj znak o indeksie 15
Podaj znak o indeksie 16
o
Podaj znak o indeksie 17
Podaj znak o indeksie 18
p
Podaj znak o indeksie 19
Podaj znak o indeksie 20
.
|q|
|w|
|e|
|r|
|t|
|y|
|u|
|i|
|o|
|p|
|.|
1

Dzieje się tak dlatego, że funkcja scanf() to szmelc. Jej kiepskość polega na tym, że po wciśnięciu entera owszem zapisuje do przekazanej zmiennej to, co wprowadzono do stdin, ale ten znak \n powstający po wciśnieciu entera zostawia w buforze.
Stąd prinf() wyrzuca wynik w nowej linii, a także podwójne zrobienie się pętli do/while:
1 przejście scanf zatrzymuje się i czeka na wprowadzenie danych, sczytuje je zostawiając śmiecia '\n'
2 przejście scanf znajduje '\n' z poprzedniego wpisu więc się nie zatrzymuje, sczytuje go tym razem czyszcząc bufor stdin.
3 przejście bufor jest czysty, więc scanf się zatrzymuje.

0

Bardzo prosto - zamieniasz wywołanie scanf() na takie:

     scanf(" %c",&a);//ARCYISTOTNA jest tutaj ta spacja przed %c

https://onlinegdb.com/BytAEKdJ4

Odpowiedź na pytanie z komentarza:
Dokumentacja scanf - tam w sekcji format jest fragment "whitespace characters:" gdzie jest wyjaśnienie.

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