0

就像我的最后一个问题一样,这与我的学校项目有关。我必须在 C 中做一个“类似推特”的程序,但我遇到了一个小布局问题。请记住,我知道此代码未优化,我首先“玩弄”以使基础工作正常。

这是我遇到问题的功能(不要注意带有所有\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”,然后您将被卡住(尽管计数器仍然会下降而不移动)

如果您对如何解决此问题或如何改进此问题有任何想法,欢迎一切!

先感谢您 !

4

1 回答 1

1

您的想法似乎偏离了通常的 CLI 设计。也许GUI对此会更明智。

如果您真的希望使用 CLI,让我们看看如何围绕 CLI 为您的应用程序建模,而不会妨碍您。使用 CLI 的人可能会期待在 CLI 中运行的应用程序的某些内容:

  1. 典型的 CLI 具有保留先前输入行的缓冲区,使用 CLI 的人对此已经习惯了。因此,“向上”箭头被大量使用。这在您的应用程序中实现起来会很复杂,对吧?
  2. CLI 应用程序往往会很快返回到 shell,即使它们作为后台进程无限运行。同样,使用 CLI 的人已经习惯了这一点。他们可能想在你的“twitter”运行时输入命令,如果它阻止他们这样做,他们可能会想关闭它。
  3. 您已经发现了退格问题。

您如何一次实现所有这些功能,而不会使您的代码库过于复杂?将其拆分为两个应用程序:

  1. 接收消息的程序。该程序在后台运行,将收到的任何消息写入由argv. 这样,用户可以创建一个命名管道来发送消息。当用户想要接收和查看消息时,他/她可以cat messages回到他/她决定查看消息之前的任何事情,甚至无需切换窗口。该程序遵循与许多久经考验的程序相同的设计原则,例如 apache 等在后台运行并记录到文件的程序。
  2. 发送消息的程序。该程序发送在 中找到的消息argv并退出。您可以让它与后台应用程序通信。这样,在程序终止之前,网络延迟导致的延迟非常小。请注意,这也遵循与许多标准命令行程序相同的设计原则:lsdircd等......它完成了它的工作,然后退出,允许再次使用 CLI 会话。当用户想要发送消息时,他/她可以send message ...,然后回到他/她之前正在做的事情。

通过将您的设计分成两个程序,您已经满足了所有这三个期望,而没有任何麻烦的库,例如 ncurses 或系统相关的 hack。shell 为您处理向上箭头的行为(或者它不处理,在这种情况下用户可能不会关心),后台进程不会阻止用户在同一个控制台窗口中执行其他工作,并且shell 为你处理退格,所以你也不需要处理它。

我看到的唯一其他选择是使用 GUI 或诸如 ncurses 之类的库,这将使您能够创建相同的功能,但使用更复杂的解决方案和更少的可移植性。

于 2013-04-03T13:20:02.883 回答