0

最後の質問と同様に、これは私の学校のプロジェクトに関するものです。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」を削除できて、スタックします (ただし、カウンターは移動せずにダウンします)。

これを修正する方法、またはこれを改善する方法についてのアイデアがあれば、すべて大歓迎です!

前もって感謝します !

4

1 に答える 1

1

あなたのアイデアは、通常の CLI 設計から逸脱しているように思われます。おそらく、これにはGUIの方が賢明でしょう。

本当に CLI を使用したい場合は、邪魔にならずに CLI を中心にアプリケーションをモデル化する方法を見てみましょう。CLI を使用するユーザーは、CLI で実行されるアプリケーションについて次のことを期待する場合があります。

  1. 典型的な CLI には、前の入力行を保持するバッファーがあり、CLI を使用するユーザーはこれに慣れています。したがって、「上」矢印がよく使用されます。これをアプリケーションに実装するのは複雑ですよね?
  2. CLI アプリは、バックグラウンド プロセスとして無限に実行されている場合でも、かなり迅速にシェルに戻る傾向があります。繰り返しますが、CLI を使用する人はこれに慣れています。彼らはあなたの「twitter」が動いている間にコマンドを入力したいと思うかもしれません。
  3. バックスペースの問題はすでに発見されています。

コードベースを複雑にしすぎずに、これらすべての機能を一度に実装するにはどうすればよいでしょうか? 2 つのアプリケーションに分割します。

  1. メッセージを受け取るプログラム。このプログラムはバックグラウンドで実行され、受信したメッセージを で示されるファイルに書き込みますargv。このようにして、ユーザーは名前付きパイプを作成してメッセージを送信できます。ユーザーがメッセージを受信して​​確認したい場合は、cat messagesウィンドウを切り替えることなく、メッセージを確認する前の操作に戻ることができます。このプログラムは、バックグラウンドで実行され、ファイルにログを記録する apache などの多くの実績のあるプログラムと同じ設計原則に従います。
  2. メッセージを送信するプログラム。このプログラムは、で見つかったメッセージを送信しargvて終了します。バックグラウンドアプリと通信させることができます。そうすれば、プログラムが終了するまでのネットワーク遅延による遅延はほとんどありません。これも、多くの標準的なコマンドライン プログラムと同じ設計原則に従っていることに注意してください: lsdircdなど... 仕事をしてから終了し、CLI セッションを再度使用できるようにします。ユーザーがメッセージを送信したい場合、ユーザーは を送信してから、send message ...以前に行っていたことに戻ることができます。

設計を 2 つのプログラムに分割することで、ncurses やシステム依存のハックなどの面倒なライブラリを使用せずに、これら 3 つの期待をすべて満たすことができます。シェルが上向き矢印の動作を処理します (または処理しない場合、ユーザーはおそらく気にしないでしょう)、バックグラウンド プロセスは、ユーザーが同じコンソール ウィンドウで他の作業を行うことを妨げません。シェルはバックスペースを処理するので、それも処理する必要はありません。

私が見る他の唯一のオプションは、GUIまたはncursesなどのライブラリを使用することです。これにより、同じ機能を作成できますが、はるかに複雑なソリューションを使用し、移植性が低下します.

于 2013-04-03T13:20:02.883 に答える