簡體   English   中英

在C中從命令行編輯正文

[英]Edit a body of text from the command line in C

我正在用C編寫一些小程序-一些登錄,注銷,創建帳戶,將消息發送到另一個帳戶的交易-我可以在此基礎上進行更改,創新和完善以提高我在C中的技能。

我試圖弄清楚的是如何實現“撰寫郵件”選項的一部分。 在提示您輸入郵件的收件人,主題和正文之后,我希望能夠返回並對其進行編輯,而無需重新輸入整個內容。 因此,如果我選擇“編輯消息”選項,它將寫出我擁有的內容,然后讓我返回並更改某些內容。

我已經在x86匯編中完成了類似的工作,或者開始進行了這樣的工作,因此我基本上了解了如何在計算機級別實現此功能,但是我不知道如何在C中實現它。我做這個嗎?

諸如此類的事情使我困惑於C語言:

  • 處理潛在的長時間輸入的好方法
  • 如何寫出文本並允許用戶對其進行編輯,而又不會超出特定點
  • 如何控制光標的位置

另外,如果以前已經做過,並且有一個類似這樣的功能的庫(甚至是我不知道的標准庫),請注意,我確實想為學習而自費

我想我腦中的方法是一次讀取一個消息正文,這樣我就可以解釋回車並創建多行消息。 但是我不確定如何通過它退格。 我想從命令行(?)做到這一點真的很難。

如果不是不可能的話,請向后移動光標並清除輸入緩沖區中已有的字符...我是否每次都必須“重新繪制屏幕”? 就像我可以控制整個控制台並只在特定位置讀取和寫入擊鍵一樣嗎? 還是太靠近機器了? 我有點用匯編來做到這一點,但是它使用了16位中斷,我不允許在C中使用它。這就是我在匯編中寫的:

(曾經在這里的圖像消失了)

程序將一個字節值轉換為代表該字節的兩個字符代碼,然后跳到右列並寫入原始字節(顯示為字符),然后跳回並寫出另外兩個十六進制數字,下一個插槽...等等,從左到右,從上到下...很簡單,但是我知道如何在C中實現。我所能做的就是INT 21樣式的輸入和輸出,編寫行到會向上滾動窗口的控制台,依此類推。

ANSI C中沒有辦法制作便攜式線路編輯器。 如果您自己滾動,則必須為要運行程序的每個新操作系統重新滾動它。

如果我可以提出建議,我將使用一個預先存在的庫來完成所有艱苦的,特定於平台的骯臟工作,並以這種直率的態度學習如何處理任意長度的輸入之類的東西。 然后,當您的代碼正常工作(並且很好)時,學習如何完成所有這些骯臟的工作,並取走庫拐杖。 這樣,您就無法解決所有問題,而是將其分解為更易於管理的部分。

甚至這有點過於簡單化。 我花了相當長的時間來學習如何處理任意長度的輸入。

另外,要知道,如果您希望代碼具有可移植性,那么刪除庫依賴項將意味着,如果要移植它,則必須要么a)重寫所有這些骯臟的代碼,要么b)添加圖書館回來。

要開個玩笑,這是您的大腦與庫:

Pigmaei gigantum humeris impositi plusquam ipsi gigantes vident。
(如果我看得更遠,那就是站在巨人的肩膀上。)
- 艾薩克·牛頓

這是沒有庫的大腦:

如果我還沒有看到其他人,那是因為巨人站在我的肩膀上。
-哈爾·阿伯森

您說要避免使用庫(標准庫或其他庫),但是不幸的是,在C語言中,所有輸入和輸出都是通過庫執行的-語言本身絕對沒有輸入/輸出功能。

因此,您注定要使用某種類型的庫。 鑒於您似乎想要一個文本界面,我建議您看一下curses的便攜式版本PDCurses

我寫了一個文本編輯器。

我從事C已有20年了。

文本的數據結構是我曾經寫過的最復雜的單個數據結構。 這是一個數據結構,可以根據您的指定有效地處理任意長度的文本。

如果您是C語言的新手,那么您所咬的東西比您可以咀嚼的更多。

我建議一個簡單的數據結構,例如緩沖區或鏈表-您不能處理任意長度的文本,但是總比沒有好。

這與系統(OS)高度相關。 我認為您正在嘗試在Windows上執行此操作。

您可以使用Windows控制台API來執行此操作。

如果您想學習一些庫以供參考(在自己動手之前),那么一個不錯的庫是GNU Readline

至於保存數據,我猜想繩索將是可用的最佳數據結構:以簡化形式,它是一棵字符串樹。 當您想在屏幕上打印時,您需要做的就是按預定順序走動並打印。 將一條線分成兩段涉及一個相對簡單的樹操作:添加葉。 困難的部分是拆分字符串本身(復制字符串,將舊端設置為0,添加葉子,添加指針)...

現在,存在跟蹤光標的問題...您可以留下一條痕跡,從根到當前光標所在的位置。

還考慮過一種可調整大小的控制台...也就是說,如果您希望編輯器能夠在終端寬度為80或200個字符的情況下工作...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM