curses動作不良

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
えいえい

curses動作不良

#1

投稿記事 by えいえい » 7年前

今、Ubuntuからcursesの勉強をしてまして、私が思っていた結果
と違う動きをし悩んだ末、投稿させていただきました。

以下のようなプログラムで
値を12345..と入力しエンターキーを押すとこの行の先頭に行ってしまうのです。youtube参照
[youtube][/youtube]

#include<ncurses.h>
#include<locale.h>

main()
{
int c;


setlocale(LC_ALL,"");

initscr();
echo();
//noecho();
//cooked();
//nonl();
//nonl();
//nocbreak();
//cbreak();
//raw();
//noecho();
//beep();


addstr("関数addch()のテストです\n");
addstr("プログラムを終了するには'e'を入力してください\n");
refresh();

while((c = getchar()) != 'e')
{
addch(c);
refresh();
}
endwin();

return 0;
}


理想だと
12345 enter
12345

になるはず。。

これはデフォルトでcookedモードになっているのかわからないし
getchar( )でバッファリングされているかもわからないなど、、、
Ubutuの端末が問題なのか、cursesのバージョンが問題なのか、
先に進みにくい状態になってしまってます。

どうかよろしくお願いします。

mikko

Re: curses動作不良

#2

投稿記事 by mikko » 7年前

Enter を押した時に getchar() から返るのが \n ではなく \r だからだと思います。
下記のようなごまかしでいかがでしょうか。

コード:

while((c = getchar()) != 'e')
{
	if (c == '\r') c = '\n';
	addch(c);
	refresh();
}

えいえい

Re: curses動作不良

#3

投稿記事 by えいえい » 7年前

mikkoさんありがとうございます。
if (c == '\r') c = '\n';
加えたら改行は解決しました。しかし
getchar( )がバッファリングしてないようで、以下のようにならないです

<理想>
12345 Enter
12345

<現実>
12345 Enter
_

なおnoecho( )モードで入力すると表示してしまうなど、
機能しているのか、していないのか、なんだかおかしいのです。
ご教授お願いいたします。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: curses動作不良

#4

投稿記事 by ISLe » 7年前

えいえい さんが書きました:これはデフォルトでcookedモードになっているのかわからないし
getchar( )でバッファリングされているかもわからないなど、、、
Ubutuの端末が問題なのか、cursesのバージョンが問題なのか、
先に進みにくい状態になってしまってます。
まずはgetcharの替わりにgetchを使うべきかと。

えいえい

Re: curses動作不良

#5

投稿記事 by えいえい » 7年前

ISLeさんありがとうございます。
getch( )に変えて、さらにecoho()でnobreak( )にしたら理想通りなりました。

しかし、何でgetch( )じゃないとできないのか? getchar( )は何で駄目なのか?
ネットで調べても違いがわかる内容ででてこないです。

ご教授おねがいします

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: curses動作不良

#6

投稿記事 by ISLe » 7年前

getcharは標準ライブラリ関数(あるいはマクロ)なので、cursesライブラリを使ったモード変更が影響するかどうか保証がないですが、
getch関数はcursesライブラリの関数なので、cursesライブラリを使ったモード変更は適用されると期待できます。

閉鎖

“C言語何でも質問掲示板” へ戻る