|
Вопрос # 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): Предложены все возможные варианты.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|