2012-02-08 81 views
1

我開始設計一個shell應用程序,在我正在使用的類中的終端內運行。限制控制檯輸入長度爲C:

這當然會涉及從用戶讀取可變長度的輸入字符串(命令)。我知道我可以簡單地將每個命令讀入一個我認爲合適的緩衝區,但這有可能導致a)截斷命令或b)導致緩衝區溢出。

如果可能,如何限制用戶輸入到控制檯的長度?

說,如果我設置命令長度爲3,123將被允許,但是如果123是在輸入字符串中已經存在(用戶已經按下之前輸入),並且用戶嘗試添加4,沒有字符將打印到控制檯,甚至可能發生'錯誤ping'。我知道我可以設計這樣的功能,但如果需要這樣的功能,我不知道從哪裏開始做這樣的事情。

無論是預先存在的解決方案或實施我自己的解決方案的建議將不勝感激。

編輯:

我想廉價和簡單的解決方案將是在時間上讀取字符的命令,直到達到一個輸入信號或者達到最大長度。這種解決方案會出現問題嗎?

回答

2

我有readline經驗不多,但這裏是你可以嘗試什麼:

  • 編寫檢查rl_end如果您希望讓更多
    • (在rl_line_buffer的字符數)的函數,只需返回rl_getc
    • 如果沒有,你可以使用rl_ding
  • 集T他rl_getc_function打電話給你的功能上面

描述作爲一個側面說明,如果你使用readline,你並不需要限制在所有的(因爲它去圖書館管理它的內存)的輸入。您可能感興趣的另一個(更簡單)功能是getline

+0

隨着一點適應,我得到了這個工作相當好。謝謝!這是我需要的。 – 2012-02-08 20:35:35

2

控制檯的這種低級別控制並不是包含在C的相當基本的內置I/O模型中。

您需要研究一些特定於平臺的內容,例如適用於類Unix系統的ncurses

+0

謝謝您的回答。我正在尋找更多的標準庫或輕量級定製解決方案,因爲我不認爲使用ncurses可能適合我的任務,但我很欣賞這個建議。如果沒有其他出現,我會接受這個答案。 – 2012-02-08 09:18:36

0

作爲對您的編輯的迴應,終端通常是行緩衝的,允許用戶在打開輸入之前儘可能多地輸入內容,而您甚至不知道它。您可以將終端設置爲raw或cbreak模式,但是您將進入平臺特定的領域。

相反,我建議你避免這個問題,並接受終端是200萬年前的一個愚蠢的遺蹟。大多數平臺將LINE_MAX定義爲任何程序需要處理的最大行大小。除此之外,你可以簡單地假設你的用戶正在搞砸你,並截斷。

1

如果沒有深入瞭解特定於平臺的控件,您無法限制在使用「Enter」之前可以在控制檯中鍵入多少個字符。

可以做的是檢查輸入緩衝區中是否存在換行符;如果它不在那裏,那麼用戶鍵入的字符多於您準備處理的字符數。您可以拒絕該輸入,然後重複閱讀stdin,直到看到換行符。

例子:

#include <stdio.h> 
#include <string.h> 
... 
char buf[SIZE]; 
... 
printf("Gimme something: "); 
fflush(stdout); 

if (fgets(buf, sizeof buf, stdin)) 
{ 
    char *newline = strchr(buf, '\n'); 
    if (!newline) 
    { 
    printf("Input too long: \"%s\"\n", buf); 
    while (!newline && fgets(buf, sizeof buf, stdin)) 
     newline = strchr(buf, '\n'); 
    } 
    else 
    { 
    // do something with buf 
    } 
}