ввод строки без ограничений на ее длину

  • Автор темы Froex
  • Дата начала
F

Froex

Приведу на ваш суд свою функцию ввода строки, причем ее длина ограничена только памятью компьютера (а вообще 1 Гб, но столько пользователь не введет).
Работа следующая: под каждый печатаемый символ просто выделяется еще память. Недостаток сразу виден: не будет освобождаться памяти при стирании символов, но это я потом доделаю, в принципе, не очень то сложно будет. А также не обрабатывается ввод непечатаемых символов, т.е. если пользователь нажмет не ту клавишу, то есть вероятность ее обработки (например символ Ctrl или Alt - некоторые системы плюют на это, но некоторые начинают почему-то обрабатывать).
Для работы потребуется стандартная библиотека stdlib, из которой мы используем функцию malloc() выделения памяти и free() освобождения памяти. Написаная функция getstr() возвращает указатель на введенную строку. Ввод, конечно, прерывается по нажатию клавиши enter (символ '\n' в коде).
Код:
//============================================
//return pointer on a string
//============================================
char *getstr()
{
char *str, *tmp, ch;
int i=0;
str = (char*) malloc (sizeof(char)*2);
while(((ch=getchar()) != '\n')&&(ch!=EOF))
{
i++;
str[i-1] = ch;
str[i]  = '\0';
tmp	 = (char*) malloc (sizeof(char) * (i+2));
scopy(tmp, str);
free(str);
str	 = tmp;
}
tmp = (char*) malloc (sizeof(char) * (i + 1));
scopy(tmp, str);
free(str);
str=tmp;
return str;
}
//эта функция копирует строку src в начало строки dest, включая символ конца строки '\0'
//можно записать и
//while(*dest++=*src++);, но некоторые компиляторы ругаются на эту запись
void scopy (char *dest, const char *src)
{
while(*src)
{
*dest=*src;
dest++;
src++;
}
*dest='\0';
}
 
E

European

А зачем изобретать велосипед, если есть std::string
 
F

Froex

я с std::string не работал. Да и самому захотелось сделать. Делаю эту функцию я многому научился, вряд ли бы смог бы это изучить, рассматривая код стандартной string.
 
A

alexsid

плохое решение
недостаточное использование библиотечных функций (realloc)
нет поддержки двухбайтовых символов
 
F

Froex

постараюсь реализовать))) спасибо за замечание
 
A

alexsid

тада уже добавь параметр файлового потока откуда ввод идет
с дефолтным значением - читать с экрана
для ввода юзаеццо fgetc
Код:
char *getstr(FILE* stream=stdin)

Хоть мона ее будет заюзать где-нить
 
F

Froex

Спасибо. В свободное от работы время начну работать над этим.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!