就像我的上一个问题一样,这与我的学校项目有关。我必须用 C 语言编写一个“类似 twitter 的”程序,但我遇到了一个小布局问题。 请记住,我知道这段代码没有经过优化,我首先“尝试一下”以使基础知识正常工作。
这是我遇到问题的函数(不要注意带有所有\b 的 printf,它只是暂时的并且非常困惑):
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 常量就是这个大小)。基本上,当用户键入时,它会显示文本右侧写入的字符数(有点像文本框底部的 twitter)。
我遇到的问题是,当您输入很长的内容并到达命令窗口的一侧时,它会“中断”并转到下一行,我最终会在窗口中看到如下内容:
Saisissez votre message (140 caracteres max):testtesttesttesttesttestt 025 / 140
esttesttesttetstesttesttesttesttesttesttesttesttesttesttesttesttesttes 095 / 140
ttest 100 / 140
令我困扰的是,当您删除文本(退格键或 '\b' )时,它会停在您所在的行处。如果你看一下这个例子,你可以删除最后一行的“ttest”,然后你就会被卡住(尽管计数器仍然会下降而不移动)
如果您对如何解决此问题有任何想法或对如何改进此问题有任何想法,欢迎提出!
提前谢谢您!
最佳答案
看来您的想法偏离了通常的 CLI 设计。也许 GUI 对此更明智。
如果您确实希望使用 CLI,让我们看看如何围绕 CLI 建模您的应用程序,而不会造成太多干扰。使用 CLI 的人可能期望在 CLI 中运行的应用程序具有某些功能:
- 典型的 CLI 具有保留先前输入行的缓冲区,使用 CLI 的人对此已经习惯了。因此,经常使用“向上”箭头。这在您的应用程序中实现起来会很复杂,对吧?
- CLI 应用程序往往会相当快地返回到 shell,即使它们作为后台进程无限运行也是如此。同样,使用 CLI 的人也对此习以为常。他们可能想在你的“twitter”运行时输入命令,如果阻止他们这样做,他们可能会想关闭它。
- 您已经发现了退格问题。
如何立即实现所有这些功能,而不使代码库过于复杂?将其分为两个应用程序:
- 接收消息的程序。该程序在后台运行,将所有收到的消息写入
argv
指示的文件中。这样用户就可以创建一个命名管道来发送消息。当用户想要接收和检查消息时,他/她可以cat messages
然后返回到他/她决定检查消息之前所做的事情,甚至不需要切换窗口。该程序遵循与许多久经考验的程序相同的设计原则,例如 apache 等在后台运行并记录到文件的程序。 - 发送消息的程序。该程序发送在
argv
中找到的消息并退出。您可以让它与后台应用程序通信。这样,在程序终止之前,由网络延迟引起的延迟就很小。请注意,这也遵循与许多标准命令行程序相同的设计原则:ls
、dir
、cd
等...它完成工作,然后退出,允许再次使用 CLI session 。当用户想要发送消息时,他/她可以发送消息...
,然后返回到他/她之前所做的事情。
通过将您的设计分成两个程序,您已经满足了所有这三个期望,而无需任何繁琐的库(例如 ncurses 或依赖于系统的 hack)。 shell 为您处理向上箭头行为(或者不处理,在这种情况下用户可能不会关心),后台进程不会阻止用户在同一控制台窗口中执行其他工作,并且shell 会为您处理退格键,因此您也不需要处理它。
我看到的唯一其他选择是使用 GUI 或 ncurses 等库,这将使您能够创建相同的功能,但使用更复杂的解决方案,并且可移植性较差。
关于c - Twitter 之类的 "characters left"C 中的函数问题 : How to prevent it from going to the next line?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15783510/