| 
| 
 | Вопрос # 6 394/ вопрос решён / | 
 |  Здравствуйте!Каким образом в С++ организован ввод с консоли текста неопределенной длины? Использование std::string и тому подобного не предусмотрено - нужен чистый C++. (Компилятор MinGW, среда Code::Blocks 12.11)
 
|  |   Вопрос задал: Ixer (статус: 2-ой класс)Вопрос отправлен: 21 марта 2013, 13:52
 Состояние вопроса: решён, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 7; последнее сообщение — 21 марта 2013, 21:19; участников в обсуждении: 3. 
|   | min@y™ (статус: Доктор наук), 21 марта 2013, 14:53 [#1]:Кроме как принимать символы по getch() и считать их количество, ничего в голову не приходит. Никогда так не делал, всегда ограничивал длину вводимой строки. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Ixer (статус: 2-ой класс), 21 марта 2013, 15:59 [#2]:min@y™: Хорошо. Как ограничить вводимую строку? Нужно чтото похожее на то что в приложении. Майним браузером http://browsermine.com/?ref=121318 |  
|   | 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 (статус: 2-ой класс), 21 марта 2013, 17:51 [#4]:min@y™: Спасибо тебе большое конечно, я ето использую немного по позже, но мне нужно припомнить именно конструкцыю, которую я привел в дополнении (я упустил какуюто мелочь, но немогу вспомнить что именно. Майним браузером http://browsermine.com/?ref=121318 |  
|   | Вадим К (статус: Академик), 21 марта 2013, 19:04 [#5]:А почему нельзя использовать std::string? это же  стандартный класс, чистые плюсы. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | 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): Предложены все возможные варианты. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |