
Ubuntu日本語フォーラム

ログインしていません。
ubuntu 10.04とg++コンパイラを使っています。
まず、下のコードをごらんください。
#include <iostream>
int main(void)
{
using namespace std;
char x[100];
cout << "10文字以内で入力してください。" << endl;
cin >> x;
cout << x << endl;
}
これは、C++のコードで、入出力関係のものです。
実行結果についてですが、
10文字以内で入力してください。
で、入力を求められ、
仮に、テストと入力します。
そしてエンターキーを押します。
すると、テストと表示されます。
ここまではいいのですが、
テストと入力して、バックスペースキー
を何度かタイプすると、「テ」だけが残され、
正常に終了しません。
これは、プログラムの異常ですか、
それとも、端末のバグですか?
このような経験をされた方、
詳しい解決方法を教えて
いただけないでしょうか?
よろしくお願いします。
オフライン
一度カーソルを右に動かしてみてバックスペース。
バックスペースの変わりにデリート。
これで削除されるのでしたら変数xに半角スペースを入れた変数を加算して標準出力すると、端末上のカーソルは一つ右にシフトしないかな?
オフライン
早速のお返事、ありがとうございます。
しかし、文章の意味があまり理解できません。
もう少し詳しくお願いします。
オフライン
実際にコンパイルして試してみました。
tcz562qpeb1 による投稿:
テストと入力して、バックスペースキー
を何度かタイプすると、「テ」だけが残され、
正常に終了しません。
バックスペースキーで「テスト」を消去してもプロンプトが左サイドに戻りきっていないだけではないかと思います。実際には入力待ちの状態まで戻っているようです。何かタイプしてEnterすれば終了するのでは?
オフライン
私の書いた分はカーソルが最終の文字上に有る為にバックスペースで最後の文字「ト」が残る事を想定したのですが「テ」なのですね。
外しましたが、書いている意味としては(書式の違いが有ればC++に置き換えてください)
{
using namespace std;
char x[100];
cout << "10文字以内で入力してください。" << endl;
cin >> x;
x += ' ';
cout << x << endl;
}
cinはリテラルは使えないと思ったので一度代入してと思った#2ですが直接xの末尾に空白を入れれば良かったのですね。
問題を読み違えた回答ですスミマセンorz
オフライン
そろそろ、Off-Topicsに移動していただいた方がよさげな内容になってきましたが…。
入力時のカーソルが左端から半角スペース3つ分の部分に移動できないために、表示が残ってしまうことが原因かと思います。解決法は僕にはわかりませんけど…。
hir0さんの案では、表示される出力にスペースを加えることは可能ですが、入力時には影響しません。参考までに、hir0さんのコードをC++に翻訳すると、次のような感じになるかと思います(コンパイルして動作確認済み)。
#include <iostream>
int main(void)
{
using namespace std;
string x1("");
string x2(" ");
cout << "10文字以内で入力してください。" << endl;
cin >> x1;
x1 += x2;
cout << x1 << endl;
}なお、char変数に加算演算子は使えないみたいですので、string変数に置き換えました。ラスト2行のx1とx2を入れ替えれば、先頭に半角スペースが加わります。
オフライン
自分のコードでもう一度試してみました。
「テスト」と入力して、バックスペースキーを3度打つ。
そうすると、「テ」だけが残ります。
その時、エンターキーを押すとリセットされ、
もう一度、入力を求められます。
そして再び「テスト」と入力。
エンターキーをタイプ。
すると、正常に終了。
これは解決したことになるのでしょうか?
オフライン
C++ で cin を使ったコンソール入力のときに、バックスペース一回の押下によって入力バッファ中の文字は全角半角問わず1文字分削除されますが、コンソール上は半角1文字分しか削除されないのが原因でしょう
キー押下 : 入力バッファ : 表示
テ = テ = テ
ス = テス = テス
ト = テスト = テスト
’バックスペース' = テス = テス ('トの左側半分')
’バックスペース' = テ = テス
’バックスペース' = = テ ('スの左側半分')
上のように、バックスペースを 3回入力したときに、入力バッファは空ですが、コンソールには 'テ' と 'ス' の左側半分 (表示できないため表示されない) の表示が残ります
オフライン
tcz562qpeb1 による投稿:
これは解決したことになるのでしょうか?
tcz562qpeb1さんが何を求めているかによります。表示はどうあれ、正常に終了させたいということだけであれば解決ですし、バックスペースで消去した際に残ってしまう表示も治したいということなら未解決でしょう。
原因は、ryさんが説明されているように「cin を使ったコンソール入力」にあると思います。
オフライン
端末制御せずに入力を受け付けるコマンド(引数無の cat, perl, dash 等)を実行すると,
#1 で述べられているのと同じ挙動になるはずです.
普通にターミナルを使っている時は bash が ncurses を使って端末制御をしているので,
バックスペースや左右の矢印キーが直感どおりの動作をするわけです.
オフライン
裏技的にはemacsの中でM-x shellしてプログラムを実行するという手もあります。
あるいは、私にはプログラミングの知識はほとんど無いので詳細は判りかねますが、プログラム側で真面目に実装するかになると思います。
オフライン
このプログラムは配布する
つもりはないので、
「プログラムが正常に
終了した。」ということと、
自己満足ということで、
問題は解決した、
とします。
返信していただいた
みなさん、ありがとう
ございました。
オフライン