Твиттер, как "оставленные символы", вызывает проблемы в C: как предотвратить переход на следующую строку?
Как и мой последний вопрос, это касается моего школьного проекта. Я должен сделать "твиттероподобную" программу на C, и у меня небольшая проблема с макетом. Пожалуйста, имейте в виду, что я знаю, что этот код не оптимизирован, и я сначала "играю", чтобы заставить основы работать.
Вот функция, с которой у меня проблемы (не обращайте внимания на printf со всеми \b, она только временная и очень грязная):
printf("Saisissez votre message (%d caracteres max):",DIM_MSG); //Message entry character by character
//Boucle de saisie de message caractere par caractere
while((temptweet=getch()) != '\r' )
{
if ( temptweet == '\b' ) {
if( i>0 ){
printf ( "\b\b\b\b\b\b\b\b\b\b%c%c%c%c%c%c%c%c%c%c\b\b\b\b\b\b\b\b\b\b", ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',' ',' ');
}
if ( i != 0) {
printf ( "\b%c\b", ' ' );
i--;
printf(" %03d / %d",i,DIM_MSG); //Shows the remaining chracters left
}
}
else if (i<DIM_MSG){
flag=0;
if(i!=0){
printf ( "\b\b\b\b\b\b\b\b\b\b%c\b", ' ' );
}
tweet[i] = (char)temptweet;
printf("%c",tweet[i]);
if(i>=(DIM_MSG-WARN)){Color(12,0);}
printf(" %03d / %d",i+1,DIM_MSG);
if(i>=(DIM_MSG-WARN)){Color(7,0);}
i++;
}
if( i==0 && flag!=1){
printf ( "\b\b\b\b\b\b\b\b\b\b%c%c%c%c%c%c%c%c%c%c\b\b\b\b\b\b\b\b\b\b", ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',' ',' ');
flag=1;
}
}
tweet[i]='\0';
Эта функция позволяет пользователю ввести сообщение и показывает пользователю, сколько символов осталось для его ввода (константа DIM_MSG - это размер). В основном, когда пользователь печатает, он показывает количество символов, написанных справа от текста (вроде как твиттер внизу текстового поля).
Проблема, с которой я столкнулся, заключается в том, что когда вы набираете что-то длинное и достигаете боковой стороны окна командной строки, оно "ломается" и переходит на следующую строку, и в результате я получаю что-то подобное в окне:
Saisissez votre message (140 caracteres max):testtesttesttesttesttestt 025 / 140
esttesttesttetstesttesttesttesttesttesttesttesttesttesttesttesttesttes 095 / 140
ttest 100 / 140
Что меня беспокоит, так это то, что когда вы удаляете текст (клавиша Backspace или "\b"), он останавливается на той строке, на которой вы находитесь. Если вы посмотрите на пример, вы сможете удалить "ttest" в последней строке, а затем застрянете (хотя счетчик все равно будет падать, не двигаясь)
Если у вас есть идеи о том, как это исправить, или идеи о том, как это исправить, все приветствуется!
Заранее спасибо!
1 ответ
Казалось бы, ваша идея качается из обычного дизайна CLI. Возможно, GUI будет более разумным для этого.
Если вы действительно хотите использовать CLI, давайте посмотрим, как вы можете смоделировать ваше приложение на основе CLI, не слишком мешая. Люди, которые используют CLI, могут ожидать определенных вещей от приложений, которые работают в CLI:
- Типичный CLI имеет буферы, которые сохраняют предыдущие строки ввода, и люди, которые используют CLI, привыкли к этому. Следовательно, стрелка "вверх" используется очень часто. Это было бы сложно реализовать в вашем приложении, верно?
- Приложения CLI, как правило, довольно быстро возвращаются в оболочку, даже если они бесконечно работают в фоновом режиме. Опять же, люди, которые используют CLI, привыкли к этому. Они могут захотеть вводить команды во время работы вашего "твиттера", и у них может возникнуть желание закрыть его, если это мешает им сделать это.
- Вы уже обнаружили проблему возврата.
Как реализовать все эти функции одновременно, не слишком усложняя свою кодовую базу? Разделите его на два приложения:
- Программа для получения сообщений. Эта программа работает в фоновом режиме, записывая полученные сообщения в файл, обозначенный
argv
, Таким образом, пользователь может создать именованный канал для отправки сообщений. Когда пользователь хочет получать и проверять сообщения, он можетcat messages
затем вернитесь к тому, что было, прежде чем он / она решит проверить сообщения, даже не переключая окна. Эта программа следует тем же принципам разработки, что и многие испытанные программы, такие как apache и тому подобное, которые запускаются в фоновом режиме и регистрируются в файлах. - Программа для отправки сообщений. Эта программа отправляет сообщение, найденное в
argv
и выходит. Вы могли бы общаться с фоновым приложением. Таким образом, существует очень небольшая задержка, вызванная задержкой в сети до завершения программы. Обратите внимание, что это также следует тем же принципам разработки, что и многие стандартные программы командной строки:ls
,dir
,cd
и т.д.... Он выполняет свою работу, затем завершает работу, позволяя снова использовать сеанс CLI. Когда пользователь хочет отправить сообщение, он можетsend message ...
, затем вернитесь к тому, чем он занимался ранее.
Разделив ваш дизайн на две программы, вы удовлетворили все три из этих ожиданий без каких-либо громоздких библиотек, таких как ncurses или системно-зависимые хаки. Оболочка обрабатывает поведение стрелки вверх (или нет, и в этом случае пользователь, вероятно, не заботится), фоновый процесс не мешает пользователю выполнять другую работу в том же окне консоли, и shell обрабатывает возвраты для вас, так что вам не нужно это обрабатывать.
Единственный другой вариант, который я вижу, - это использование GUI или библиотеки, такой как ncurses, которая даст вам возможность создавать те же функции, но с использованием гораздо более сложного решения и меньшей мобильности.