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

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

  1. Froex

    Froex Гость

    Репутация:
    0
    Приведу на ваш суд свою функцию ввода строки, причем ее длина ограничена только памятью компьютера (а вообще 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

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

    Froex Гость

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

    alexsid Гость

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

    Froex Гость

    Репутация:
    0
    постараюсь реализовать))) спасибо за замечание
     
  6. alexsid

    alexsid Гость

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

    Froex Гость

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

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