Предельная длина входной консоли в C: - PullRequest
1 голос
/ 08 февраля 2012

Я начинаю разрабатывать приложение оболочки для запуска в терминале Linux для класса, который я беру.

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

Если возможно,Как можно ограничить длину пользовательского ввода для консоли?

Скажем, если я установлю длину команды на 3, 123 будет разрешено, но если 123 уже присутствует во входной строке (до того, как пользователь нажал клавишу ввода), и пользователь попытался добавить 4, ни один символ не будет печататься на консоли, возможно, даже с «пингом ошибки».

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

Буду признателен за ранее существовавшее решение или за советы по реализации моего собственного решения.

Редактировать:

Полагаю, дешевым и простым решением было бы прочитать команду на символ за раз, пока не будет достигнут сигнал ввода или пока не будет достигнута максимальная длина.д.Возникнут ли проблемы с таким решением?

Ответы [ 4 ]

2 голосов
/ 08 февраля 2012

У меня мало опыта с readline, но вот что вы можете попробовать:

  • Напишите функцию, которая проверяет rl_end (количество символов в rl_line_buffer)
    • Если вы хотите разрешить больше, просто верните rl_getc
    • Если нет, вы можете использовать rl_ding
  • Установить rl_getc_function для вызова вашей функции, как описано выше

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

2 голосов
/ 08 февраля 2012

Такое низкоуровневое управление консолью не является чем-то, что включено в довольно простую встроенную модель ввода-вывода С.

Вам нужно изучить что-то специфичное для платформы, например ncurses для Unix-подобных систем.

1 голос
/ 08 февраля 2012

Не углубляясь в элементы управления, относящиеся к платформе, вы не можете ограничить количество используемых символов в консоли, прежде чем нажать «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
   }
}
0 голосов
/ 08 февраля 2012

В ответ на ваши изменения терминалы, как правило, буферизуются в строке, что позволяет пользователям вводить столько, сколько они хотят, прежде чем нажать Enter, даже если вы не знаете об этом.Вы можете установить терминал в режим raw или cbreak, но затем вы входите на территорию, специфичную для платформы.

Вместо этого я бы посоветовал вам избежать этой проблемы и согласиться с тем, что терминал - это глупый след от 2миллион лет назад.Большинство платформ определяют LINE_MAX как максимальный размер строки, который должна обрабатывать любая программа.Кроме того, вы можете просто предположить, что ваш пользователь связывается с вами, и усечь.

...