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

Тема в разделе "Общие вопросы по С и С++", создана пользователем Froex, 26 ноя 2008.

  1. Froex

    Froex Гость

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    А зачем изобретать велосипед, если есть std::string
     
  3. Froex

    Froex Гость

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

    alexsid Гость

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

    Froex Гость

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

    alexsid Гость

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

    Froex Гость

    Спасибо. В свободное от работы время начну работать над этим.
     
Загрузка...

Поделиться этой страницей