Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 394

Раздел: C++
/ вопрос решён /

Здравствуйте!
Каким образом в С++ организован ввод с консоли текста неопределенной длины? Использование std::string и тому подобного не предусмотрено - нужен чистый C++. (Компилятор MinGW, среда Code::Blocks 12.11)

Приложение:
  1.  
  2. char* t;
  3. cout << "Input your text and pres Enter> ";
  4. cin >> t;
  5.  


Ixer Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Ixer (статус: 2-ой класс)
Вопрос отправлен: 21 марта 2013, 13:52
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 7; последнее сообщение — 21 марта 2013, 21:19; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 21 марта 2013, 14:53 [#1]:

Кроме как принимать символы по getch() и считать их количество, ничего в голову не приходит. Никогда так не делал, всегда ограничивал длину вводимой строки.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ixer

Ixer (статус: 2-ой класс), 21 марта 2013, 15:59 [#2]:

min@y™: Хорошо. Как ограничить вводимую строку? Нужно чтото похожее на то что в приложении.
Майним браузером http://browsermine.com/?ref=121318
min@y™

min@y™ (статус: Доктор наук), 21 марта 2013, 16:16 [#3]:

Выдрал из древнего проекта. Попробуешь разобраться с концепцией?
// Ввод строки
TModalResult GetInputString(TMessageParams* Params, string S, TTextPoint From, char MaxLength)
{
  UCHAR Key;
  int i, Len;
  char P[80]; // = (string)malloc(MaxLength + 1);
  char E[80]; // = (string)malloc(MaxLength + 2);  // Строка пробелов для затирки вводимых данных при BkSpc
  MakeString(E, ' ', MaxLength + 1);
  MakeString(P, 0, MaxLength);
  //strcpy(P, S);
  //for (i = 0; i < MaxLength; i++) P[i] = 0;
 
  GotoXY(From.Col, From.Row);
  ColorPrint(E, (*Params).InpForeground, (*Params).InpBackground);
  GotoXY(From.Col, From.Row);
  ColorPrint(P, (*Params).InpForeground, (*Params).InpBackground);
 
  do // цикл опроса клавиатуры
  {
    Key = getch();
 
    if (!Key) // Пропускаю функциональные клавиши
    {
      getch();
      continue;
    }
 
    Len = strlen(P);
 
    if ((Key > 31) && (Len < MaxLength))
    {
      P[Len] = Key;
      P[Len + 1] = 0;
      GotoXY(From.Col, From.Row);
      ColorPrint(P, (*Params).InpForeground, (*Params).InpBackground);
    }
    else if ((Key == kbBkSpc) && strlen(P))
         {
           P[strlen(P) - 1] = 0;
           GotoXY(From.Col, From.Row);
           ColorPrint(E, (*Params).InpForeground, (*Params).InpBackground);
           GotoXY(From.Col, From.Row);
           ColorPrint(P, (*Params).InpForeground, (*Params).InpBackground);
         }
  } while ((Key != 13) && (Key != 27));
 
  if (Key == 13)
  {
    strcpy(S, P);
    return mrOk;
  }
  else return mrCancel;
}
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ixer

Ixer (статус: 2-ой класс), 21 марта 2013, 17:51 [#4]:

min@y™: Спасибо тебе большое конечно, я ето использую немного по позже, но мне нужно припомнить именно конструкцыю, которую я привел в дополнении (я упустил какуюто мелочь, но немогу вспомнить что именно.
Майним браузером http://browsermine.com/?ref=121318
Вадим К

Вадим К (статус: Академик), 21 марта 2013, 19:04 [#5]:

А почему нельзя использовать std::string? это же стандартный класс, чистые плюсы.
Галочка "подтверждения прочтения" - вселенское зло.
Ixer

Ixer (статус: 2-ой класс), 21 марта 2013, 20:29 [#6]:

Вадим К: Не изучали еще )) Нужно контрольную сделать используя "полученые знания" Я уже однажды забежал вперед - не особо приветствуют ))
Майним браузером http://browsermine.com/?ref=121318
Вадим К

Вадим К (статус: Академик), 21 марта 2013, 21:19 [#7]:

Я не знаю, что там изучали. Но если std::cout/std::cin уже знаем...
Способ 1)

  char[1000] s;
  gets(s);

1000 символов скорее всего для Вас хватит. Если что - можно больше ввести.

Если же нужно реально бесконечные строки, тогда где то так

 
#include <iostream>
 
using namespace std;
 
int main() {
   char * s = NULL;
   int l = 0;
   char c;
   do {
     c = getchar();
     s = (char*)realloc(s, l+1);
     *(s+l) = c;
     l++;
   } while (c != '\n'); // это условие выхода.
   s = (char*)realloc(s, l);
   *(s+l-1) = '\0'; // добавить нулевой символ в конец.
   puts(s); // вывод
   free(s); // почистим за собой
   return 0;
}
конечно, realloc вызывать на каждый чих не совсем красиво, можно сделать более гранулированный буфер. Но почему то мне кажется, что у преподавателя от этого кода будет маленький взрыв мозга. Да, и это вообще то не С++, это си. А в плюсах - через строку.

Можно конечно и через вектор, но но это тоже боюсь не изучали. Можно связанный список сделать.

А вот через new все это делать (что бы якобы был С++), это ещё та работенка.
Галочка "подтверждения прочтения" - вселенское зло.

29 марта 2013, 17:12: Статус вопроса изменён на решённый (изменил автор вопроса — Ixer): Предложены все возможные варианты.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:42
Выполнено за 0.03 сек.