Редактировать текст из командной строки в C - PullRequest
1 голос
/ 09 мая 2009

Я пишу какую-то небольшую программу на C - некоторые входят в систему, выходят из системы, создают учетную запись, отправляют сообщение-сообщение-другому-учетной записи - на которой я могу опираться, изменять, обновлять и совершенствовать, чтобы усовершенствовать свои навыки в C.

Я пытаюсь понять, как реализовать часть опции «составить сообщение». После того, как вас попросят указать получателя, тему и текст сообщения, я хочу вернуться и отредактировать их - без необходимости повторного ввода всего текста. Поэтому, если бы я выбрал опцию «редактировать сообщение», она выписала бы то, что у меня было, и позволила бы мне вернуться и что-то изменить.

Я сделал что-то вроде этого в x86 сборке , или начал делать что-то подобное, так что я в принципе понимаю, как это будет реализовано на уровне машины, но я не знаю как реализовать это на C. Как мне это сделать?

Такие вещи сбивают меня с толку в C:

  • Хороший способ обработки потенциально длинного ввода
  • Как выписать текст и позволить пользователю редактировать его, не выходя за пределы определенной точки
  • Как управлять положением курсора

Кроме того, если это было сделано ранее, и существует библиотека функций для подобных вещей (даже стандартная библиотека, о которой я не знаю), пожалуйста, обратите внимание, что я действительно хочу свернуть свою собственную с целью обучения.

Я полагаю, что у меня в голове есть способ прочитать тело сообщения по одному символу за раз, чтобы я мог учесть возврат каретки и создать многострочное сообщение. Но я не уверен, как бы я прошел через это. Я думаю, это было бы очень сложно сделать из командной строки (?).

Если не невозможно, переместить курсор назад и стереть символы, которые уже находятся вне буфера ввода ... Придется ли мне каждый раз «перерисовывать экран»? Например, я могу просто взять под контроль всю консоль и просто читать и записывать нажатия клавиш на определенных позициях? Или это слишком близко к машине? Я вроде как делал это с ассемблером, но в нем использовались 16-битные прерывания, которые мне не разрешено использовать в C ... Вот что я написал в ассемблере:

(изображение, которое было здесь раньше, исчезло)

, где программа преобразует значение байта в двухсимвольные коды, представляющие этот байт, затем переходит к правому столбцу и записывает исходный байт (который отображается как символ), затем возвращается назад и записывает еще два шестнадцатеричных числа , в следующем слоте ... И так далее, слева направо, сверху вниз ... Это было легко, но у меня есть нет идея, как мне реализовать это в C. Все, что я могу сделать, это INT 21 стиль ввода и вывода, запись строк в консоль, которая прокручивает окно вверх и т. Д.

Ответы [ 5 ]

2 голосов
/ 09 мая 2009

В ANSI C нет способа создать переносимый редактор строк. Если вы выберете свой собственный, у вас будет возможность для его перезаписи для каждой новой операционной системы, в которой вы хотите, чтобы ваша программа работала.

Если бы я мог сделать предложение, я бы использовал уже существующую библиотеку, чтобы выполнить всю эту сложную, грязную работу, связанную с платформой, и с этим шагом научиться обрабатывать такие вещи, как ввод произвольной длины и тому подобное. , Затем, когда ваш код работает (и хорош), научитесь делать всю эту грязную работу и уберите костыль библиотеки. Таким образом, вы не решаете все это - вы разбиваете его на более управляемые части.

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

Кроме того, знайте, что если вы хотите, чтобы ваш код был переносимым, удаление зависимости от библиотеки будет означать, что, если вы хотите ее портировать, вам придется либо: а) переписать весь этот грязный код, либо b ) добавьте библиотеку обратно.

Чтобы закончить все это в шутку, это ваш мозг с библиотеками:

Pigmaei gigantum humeris impositi plusquam ipsi gigantes vident.
(Если я видел немного дальше, то стою на плечах Гигантов.)
- Исаак Ньютон

Это ваш мозг без библиотек:

Если я не видел так далеко, как другие, это потому, что великаны стояли на моих плечах.
- Хэл Абельсон

1 голос
/ 09 мая 2009

Вы говорите, что хотите избежать использования библиотек (стандартных или иных), но, к сожалению, в C все ввод и вывод осуществляется через библиотеки - сам язык абсолютно не имеет средств ввода / вывода.

Так что вы обречены использовать какие-то библиотеки. Учитывая, что вам, похоже, нужен текстовый интерфейс, я предлагаю взглянуть на переносную версию curses , PDCurses .

0 голосов
/ 09 мая 2009

Что касается хранения данных, я предполагаю, что веревка будет лучшей доступной структурой данных: в упрощенном виде это дерево строк. Если вы хотите распечатать его на экране, все, что вам нужно сделать, это пройтись по предварительному заказу и распечатать его. Разделение строки на две включает относительно простую древовидную операцию: добавление листа. Сложнее всего будет разбить саму строку (скопировать строку, установить старый конец в 0, добавить лист, добавить указатель) ...

Теперь есть проблема с отслеживанием курсора ... Вы можете оставить след крошки, чтобы следовать от корня к тому месту, где в данный момент находится курсор.

Существует также мысль о консоли с изменяемыми размерами ... То есть, если вы хотите, чтобы ваш редактор работал независимо от ширины терминала 80 или 200 символов ...

0 голосов
/ 09 мая 2009

Это тесно связано с системой (ОС). Я думаю, что вы пытаетесь сделать это в Windows.

Для этого можно использовать API консоли Windows .

Если вы хотите изучить некоторые библиотеки для справки (перед тем, как создавать свои собственные), хорошей библиотекой будет GNU Readline .

0 голосов
/ 09 мая 2009

Я написал текстовый редактор.

Я занимаюсь С двадцать лет.

Структура данных для текста была самой сложной единственной структурой данных, которую я когда-либо писал; это структура данных, которая, как вы указываете, может эффективно обрабатывать текст произвольной длины.

Если вы новичок в C, вы откусываете больше, чем можете прожевать.

Я предлагаю простую структуру данных, такую ​​как буфер или связанный список - вы не можете обрабатывать текст произвольной длины, но это лучше, чем ничего.

...