Ввод строки любой длинны 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 шт):
Вот, вспомнил:
char *response = NULL;
size_t len;
getline(&response, &len, stdin);
getline сама выделяет буфер динамически под необходимый объем.
Потом буфер надо освобождать free(response);
Вводим символы и считаем их.
Что-то похожее на это:
#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;
}
Остается предположить, что от вас хотят чего-то такого, если уж даже работа с памятью неизвестна...
#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);
}
}
Только вы бы сразу же давали точное условие, а то получается вот так...