Я написал следующую функцию для динамического выделения входной строки при наборе текста, не спрашивая у пользователя, сколько символов оно длинное.Динамическое распределение входной строки
#include<stdio.h>
#include<stdlib.h>
char* dyninp (char str[], int *n) {
char ch;
int i = 0;
do {
ch = getchar();
str = (char *) realloc(str, (i+1)*sizeof(char));
str[i] = ch;
i++;
} while (ch != '\n');
/*substitute '\n' with '\0'*/
str[i-1] = '\0';
if (n != NULL) {
/*i contains the total lenght, including '\0'*/
*n = i-1;
}
/*because realloc changes array's address*/
return str;
}
/*it is called in this way:
char *a;
int n;
a = dyninp (a, &n);
*/
Этот код работает, но у меня есть несколько вопросов о нем:
Почему это работает?
Я не понимаю, почему, когда я его выполню, я также могу удалить символы перед нажатием enter. Функцияgetchar()
читает только один символ на каждой итерации, который записывается в массив, так как я могу удалить некоторые из них?
Еслиgetchar()
удаляет предыдущий символ при получении '\ 127', тогда цикл должен продолжаться, как и любой другой символ. Но этого не происходит, потому что, когда цикл заканчивается, «i» всегда содержит точное количество элементов.Является ли мой код эффективным? Если это не так, как я могу сделать это лучше (даже используя встроенные функции)?