F
Froex
Приведу на ваш суд свою функцию ввода строки, причем ее длина ограничена только памятью компьютера (а вообще 1 Гб, но столько пользователь не введет).
Работа следующая: под каждый печатаемый символ просто выделяется еще память. Недостаток сразу виден: не будет освобождаться памяти при стирании символов, но это я потом доделаю, в принципе, не очень то сложно будет. А также не обрабатывается ввод непечатаемых символов, т.е. если пользователь нажмет не ту клавишу, то есть вероятность ее обработки (например символ Ctrl или Alt - некоторые системы плюют на это, но некоторые начинают почему-то обрабатывать).
Для работы потребуется стандартная библиотека stdlib, из которой мы используем функцию malloc() выделения памяти и free() освобождения памяти. Написаная функция getstr() возвращает указатель на введенную строку. Ввод, конечно, прерывается по нажатию клавиши enter (символ '\n' в коде).
Работа следующая: под каждый печатаемый символ просто выделяется еще память. Недостаток сразу виден: не будет освобождаться памяти при стирании символов, но это я потом доделаю, в принципе, не очень то сложно будет. А также не обрабатывается ввод непечатаемых символов, т.е. если пользователь нажмет не ту клавишу, то есть вероятность ее обработки (например символ 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';
}