2017-11-18 20 views
-2

文字列の文字の挿入と削除について質問したいと思います。 コードは次のとおりです。getch()関数を使用してBackSpaceを実装する

void Edit::input() { 
    int len = 0; 
    COORD cord; 
    cord.X = _x; 
    cord.Y = _y; 
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cord); 
    while (true) { 
     char ch = _getch(); 

     if (ch == 13) 
     { 
      break; 
     } 

     else if (ch == 8) 
     { 
      if (len == 0) 
      { 
       continue; 
      } 
      pusty.pop_back(); 
      std::cout << "\b \b"; 
      len--; 
     } 
     else if (len == 6) { 
      break; 
     } 
     else { 
      pusty.push_back(ch); 
      len++; 
     } 
     std::cout << ch; 
    } 
} 

問題は何ですか?私はテキストがこのウィンドウに入力されるウィンドウのXとYの座標を持っている、全体の文字列の長さは6文字です。問題は、lenの値が最後の要素にあるときにバックスペースを使いたいときです。その後、バックスペースは7番目のインデックスに空白を作成します。下の図はその問題を示しています。この問題を避けるには?すべてのフィードバックをありがとう。余分なスペースがあなたに文字を返すだけでなく、コンソールにエコー表示getchを、使用によるものである

enter image description here

+0

あなたのコード、結果、および予想される結果を画像としてではなくテキストとして追加してください。 – pirho

+0

'\ b'は普通はBEL文字ではありません - 端末がサポートしていれば端末ベルを呼び出しますか? –

+0

@NeilButterworth私はそれが通常 '\ a'だと信じています。 /bash-prompt-escape-sequences.html)と[windows](https://msdn.microsoft.com/en-us/library/h21280bw.aspx)を参照してください。 – hnefatl

答えて

0

。これは、コンソールの出力の7番目の位置に達しているため、背景がペイントされていることを意味します。

\b \bを印刷する前に背景色を黒に設定するだけです(例ではターコイズに設定するのと同様の方法で)した後、ターコイズに戻してください。 。

よりもむしろgetchを使用して、あなたは本当にncursesを学んで検討すべきである - それは(エコーしませんgetch同等のように)この種の状況での生活は非常に簡単に行うことができます本当に便利な機能を提供します。それはクロスプラットフォームなので、Windows上で使うことができます。

関連する問題