• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

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

  • Автор темы Автор темы 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';
}
 
А зачем изобретать велосипед, если есть std::string
 
я с std::string не работал. Да и самому захотелось сделать. Делаю эту функцию я многому научился, вряд ли бы смог бы это изучить, рассматривая код стандартной string.
 
плохое решение
недостаточное использование библиотечных функций (realloc)
нет поддержки двухбайтовых символов
 
постараюсь реализовать))) спасибо за замечание
 
тада уже добавь параметр файлового потока откуда ввод идет
с дефолтным значением - читать с экрана
для ввода юзаеццо fgetc
Код:
char *getstr(FILE* stream=stdin)

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

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab