Ввод строки любой длинны scanf

Есть задача: получить строку и выдать её в обратном порядке. Условия: длины строк и слов неограниченны. Нужно использовать списки.

Меня интересует как грамотно подсчитывать кол-во вводимых символов что бы потом выделить память для строки?

Создавать фиксированный "буффер" не вариант (оно и видно из условия).

UPD: scanf необязателен

UPD 24.05 00:16 msk: сделал так крч и всё, раз просто строку хз как обозначить чтоб из неё потом сделать список слов

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

struct str{
        int c;
        struct str *next;
};

void reverse_str(struct str *list);
void free_list(struct str *list);

int main()
{
        int c;
        struct str *main = NULL,  *sub = NULL;
        while((c = getchar()) != EOF){
                switch(c){
                        case '\n':
                                reverse_str(main);
                                free_list(main);
                                putchar(c);
                                break;
                        default:
                                struct str *tmp = malloc(sizeof(*tmp));
                                tmp->c = c;
                                tmp->next = NULL;
                                if(sub){
                                        sub->next = tmp;
                                        sub = sub->next;
                                } else
                                        main = sub = tmp;
                }
        }
        return 0;
}

void reverse_str(struct str *list)
{
        if(!list)
                return;
        reverse_str(list->next);
        putchar(list->c);
}

void free_list(struct str *list)
{
        if(list){
                struct str *tmp = list;
                list = list->next;
                free(tmp);
        }
}

Тупа список кодов символов.


Ответы (3 шт):

Автор решения: DmitryK

Вот, вспомнил:

char *response = NULL;
size_t len;
getline(&response, &len, stdin);

getline сама выделяет буфер динамически под необходимый объем. Потом буфер надо освобождать free(response);

→ Ссылка
Автор решения: c0ol

Вводим символы и считаем их.

Что-то похожее на это:

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

int main(){
    char* symbols = NULL;
    int count = 0;
    char c;
    printf("input symbols: ");
    do{
        scanf("%c", &c);
        if(c == '\n')
            break;
        symbols = (char*)realloc(symbols, ++count * sizeof(char));
        symbols[count - 1] = c;
    }while(1);
    
    printf("you wrote: %s\n", symbols);
    printf("you count: %d", count);
    
    
 for(int i=count; i>=0; --i)
    printf("s1: %c\n", symbols[i]);
    
    return 0;
}
→ Ссылка
Автор решения: Harry

Остается предположить, что от вас хотят чего-то такого, если уж даже работа с памятью неизвестна...

#include <stdio.h>

void get_out_char()
{
    char c;
    scanf("%c",&c);
    if (c != '\n')
    {
        get_out_char();
        putchar(c);
    }
}

int main()
{
    get_out_char();
}

Или без scanf

void get_out_char()
{
    int c = getchar();
    if (c != '\n' && c != EOF)
    {
        get_out_char();
        putchar(c);
    }
}

Только вы бы сразу же давали точное условие, а то получается вот так...

→ Ссылка