ママのスキンケアのお悩みにおすすめアイテム

getch関数は非常に使い勝手が良くて、キーボードから入力した文字を画面にエコーバックしませんし、エンターキーなどを押す必要もありません。
このgetch関数を標準ライブラリだけを使って作成することは可能でしょうか?
ぜひよろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

OS依存です。



Linuxなら、

#include <termios.h>
#include <unistd.h>

struct termios x;

/*標準入力を1文字入力&エコー無しに*/
ch=tcgetattr(0,&x);
x.c_lflag &= ~(ICANON|ECHO);
ch=tcsetattr(0,TCSANOW,&x);

printf("CH=%02X\n",getchar());

/*標準入力を行入力&エコー有りに*/
x.c_lflag |= (ICANON|ECHO);
ch=tcsetattr(0,TCSANOW,&x);
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2012/06/10 16:18

ANSIやISOで定義されているC標準ライブラリということであればできません。

    • good
    • 0
この回答へのお礼

そうなんですね。ありがとうございます。

お礼日時:2012/06/10 16:17

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qlinux上でgetchを使いたい

linux上でgetch()を使おうと思い、<conio.h>をインクルードしたのですが、未定義のエラーが出てしまいます。どうやら、linuxでは、<conio.h>が無い?みたいなのですが、どうやったら、getch()を使用できるようになるのでしょうか??

Aベストアンサー

基本的には #1 さんの参考 URL の方法でいいですが,
mygetch() を呼ぶたびに tcgetattr(),tcsetattr() するのでちょっと無駄が多い.
(性能低下を招くほどではありませんが.)

アプリケーションの起動から終了まで,あるいは一定期間 raw モードだけを
使うのなら,次のサンプルのように一度端末モード設定をしてあとは普通に
getchar() を使う方が効率は (少しですが) いいです.

/*--------------------------------------------------------------------------
サンプル
・1文字入力するたびに標準出力に出力する.
・制御文字は16進で出力.
・CTRL-D を押すと終了.
--------------------------------------------------------------------------*/
#include <stdio.h>
#include <unistd.h>
#include <termios.h>

#define QUIT_CHAR 0x04 /* CTRL-D を押すと終了する.*/

// 端末設定保存用大域変数
struct termios CookedTermIos; // cooked モード用
struct termios RawTermIos; // raw モード用


int main(void)
{
  int c;

  // 初期状態の端末設定 (cooked モード) を取得・保存する.
  tcgetattr(STDIN_FILENO, &CookedTermIos);

  // raw モードの端末設定を作成・保存する.
  RawTermIos = CookedTermIos;
  cfmakeraw(&RawTermIos);

  // 端末を raw モードに設定する.
  tcsetattr(STDIN_FILENO, 0, &RawTermIos);

  // 1文字入力されるごとに標準出力にエコーする.
  while((c = getchar()) != QUIT_CHAR) {
    if(isprint(c)) {
      // 印字可能文字の場合:そのまま表示.
      putchar(c);
    } else {
      // 制御文字の場合:16進で出力.
      printf("<%02X>", c);
      if(c == '\n') fputs("\r\n", stdout);
    }
  }

  // 端末設定を元に戻す.
  tcsetattr(STDIN_FILENO, 0, &CookedTermIos);
  putchar('\n');
  return 0;
}

基本的には #1 さんの参考 URL の方法でいいですが,
mygetch() を呼ぶたびに tcgetattr(),tcsetattr() するのでちょっと無駄が多い.
(性能低下を招くほどではありませんが.)

アプリケーションの起動から終了まで,あるいは一定期間 raw モードだけを
使うのなら,次のサンプルのように一度端末モード設定をしてあとは普通に
getchar() を使う方が効率は (少しですが) いいです.

/*--------------------------------------------------------------------------
サンプル
・1文字入力するたびに...続きを読む

QC言語の非標準コンソール関数getch()について

こんにちは。
あるプログラムを作っていると、次のような問題が起きてしまいました。
簡単なプログラムを例にして、説明したいと思います。

#include<stdio.h>
#include<conio.h>
#include<ctype.h>

void main(void)
{
char ch;
int i;
do{
ch=getch();
putchar(toupper(ch));
}while(ch!='q');
printf("\n");
scanf("%d",&i);
}

これはgetch()関数を使い入力された文字を大文字にして画面上に出力するものです。(qが入力されるまで)
その後に、意味はありませんが変数iに整数を入力して終了する。
ここで、問題になってくるのがこのプログラムを実行して、abcdefqと入力していくと、画面上にはABCDEFQと表示されます。そして、qが入力されたことでdo文が終了して改行が行われます。次にscanfによりいったん入力待ちになります。
この時、まだ、なにも入力していないにも関わらず、最後にgetchにより入力したqが表示されてしまいます。
qを消してscanfの入力をすればいいのですが、この問題を何とか解決したと思い質問しました。
scanfの後にgetchar()を使うときはscanf入力時の'\n'に注意が必要だということはわかるのですが、上に述べたような問題はこれに似ているのでしょうか?
参考書をみたり自分でもいろいろ試してみたのですがどうもうまくいきません。

どなたか、解決策を知っていたら是非教えて下さい。
できれば、getch()とscanfがどのように作用してこのようなことが起きてしまっているのか説明して頂けたら幸いです。
お手数ですが、みなさま、よろしくお願いいたします。

こんにちは。
あるプログラムを作っていると、次のような問題が起きてしまいました。
簡単なプログラムを例にして、説明したいと思います。

#include<stdio.h>
#include<conio.h>
#include<ctype.h>

void main(void)
{
char ch;
int i;
do{
ch=getch();
putchar(toupper(ch));
}while(ch!='q');
printf("\n");
scanf("%d",&i);
}

これはgetch()関数を使い入力された文字を大文字にして画面上に出力するものです。(qが入力されるまで)
その後に...続きを読む

Aベストアンサー

何か問題が正確に伝わっていなかったりするみたいですね(苦笑)

環境は Windows9X 系でしょうか。
この環境下では、getch と scanf を近いところで使うと問題が起きるんですよ。
OS が呼び出す ReadFile() が、getch() が拾ったはずのキーのキーアップイベントを、もう1度押されたと誤認するようです。
(NT系では正常に動作するそうです)

この問題は、scanf の代わりに cscanf を使うか、scanf を使う前に __flush_win95_keyup_events() を呼び出すことで回避できます。

1度試してみて下さい。

QC言語で作成したプログラムの、エコーバックをなくしたい…。

現在、SolarisでC言語の簡単なアプリケーションを作成しています。
そこで、管理者以外の人に悪用されないようにという名目で、作ったプログラムを端末エミュレータで起動させ、それに標準入力からパスワードを入力させるようにしたいと考えています。
しかし、そのためには、入力したパスワードをターミナル上に表示されては困るので、ターミナルに入力された文字列を表示させないようにするにはどうしたらよいのでしょうか?
いろいろと調べたのですが、具体的な関数がよくわからなかったので、エコーバックをなくすような関数がありましたら、是非教えてただきたいと思います。

Aベストアンサー

結構、面倒です。覚悟してください。入出力がファイルにリダイレクトされている場合の処置とか、途中でCtrl+Cを押された場合の始末とか、諸々を付け加えると100ステップを超えてしまうかもしれません。

#include <termio.h>
struct termio tbuf;
char passowrd [100];
ioctl (0, TCGETA, &tbuf);
tbuf.c_lflag &= ~ECHO;
ioctl (0, TCSETA, &tbuf);
fputs ("password: ", stdout);
fgets (password, stdin);
tbuf.c_lflag |= ECHO;
ioctl (0,TCSETA, &tbuf);

Q?

C Machineをダウンロードして、プログラムを作ったのですが、エラーで「インクルードファイル<conio.h>はオープンできません」と表示されました。なぜオープンできないんでしょうか?わかる方、教えてください。

Aベストアンサー

ほかのコンパイラから、conio.hをもってこればできるかと思いましたが、
LCCの試食版からもってきたらダメでした。
ほかのコンパイラのヘッダファイルだといいかもしれませんが。
ただ、ヘッダファイルにせよ、著作権は存在すると思われるので、そこは気をつけてください。
CMachineではEXEファイルを作ることはできないので、
ほかのフリーコンパイラを探してみてはどうです?

Qunsigned long long 型のフォーマット指定子

unsigned long long 型の変数の値を表示したいのですが、
フォーマット指定子は%ldですか?
よろしくおねがいします。

Aベストアンサー

規格上は、%llu のように ll を付けます。(unsigned long longなので、%lld ではなく %llu です。)
ただし、C99に準拠した処理系ではなく、単に独自拡張としてlong long型をサポートしている場合には、%Lu とか %qu とかになる場合もあります。場合によっては、long long型が存在する処理系でも、printf系関数で正しく書式化する方法が存在しないこともあり得ます。

Qエラーの意味は? Lvalue required

今プログラミングと格闘中です。タイトルにもあるように「Lvalue required」とはどういう意味か教えてください。

Aベストアンサー

補足を拝見しました。
まず、if文ですが
if(day%7=5)
では無く
if(day%7==5)
とイコールを2つ書きましょう。
それからprint文ですが
printf("%d月%d日は、土曜日です。");
%dに対する表示したい値が入っていません。

ほかにも、コンパイルエラーに掛かる場所は有りますが、簡単に直せるとこでしょうから、あえて記述致しません。

Qfgetsなどのときのstdinのバッファを消すには?

こんにちは,今C(C++でない)を使用しています。
たとえば,
char str[20]
fgets(str,sizeof(str),stdin)
としたときに20字以上を打つと,stdinのバッファに20字以上の分が残ったままになります。

C++などでは
fflush(stdin)で,うまくいきますが,普通のCでは対応がされていないみたいでうまくいきません。

よろしくお願いします。

Aベストアンサー

あ,テキスト入力だからこんな大掛かりなことしなくてもいいんだ.
末尾に'\n'が出るまで掃出せばいいんですよね.

fgets(str, sizeof(str), stdin);
if ( str[strlen(str)-1] != '\n' ){
while( getchar() != '\n' );
}

でいいんだ.失礼しました.

Q複数桁10進数の*桁目だけを抽出したい

タイトルがすべてと言えてしまうのですが、
例えば、int宣言された"4287"(この値は変動します)という数値があったとして、1桁目の"7"だけを別の変数へ引き抜きたいのですが、その場合にはANDによるマスク処理による演算で処理可能なのでしょうか?
また、他に良い方法などありましたら教えていただけますでしょうか?

Aベストアンサー

★10進数ですので AND は使えませんね。
・簡単なサンプルを載せますので読み取って下さい。

サンプル1:
int value = 4287;
int a[ 4 ];

a[0] = (value % 10); value /= 10; // 1桁目を取り出す
a[1] = (value % 10); value /= 10; // 2桁目を取り出す
a[2] = (value % 10); value /= 10; // 3桁目を取り出す
a[3] = (value % 10); value /= 10; // 4桁目を取り出す

サンプル2:
int value = 4287;
int a;

a = (value % 10);
value -= a;

value → 4280
a → 7
になります。

Qprintf で二進表示を行いたい。

すみません。教えていただきたいことがあります。
printf で普通のintの値をフォーマット指定子を使用して二進表示をしたかったのですが見当たりませんでした。
どうにかintの内容を二進で確認したいのですが、どのようにすれば良いですか?
宜しくお願いします。

Aベストアンサー

★2進整数を表示する関数を自作すればよい。
・作り方は簡単で、最上位ビットから順に『0』と『1』を調べていき、ビットが
 立っていれば『putchar('1');』にして、ビットが OFF なら『putchar('0');』
 にすれば良いでしょう。
・下にサンプルを載せますので使いやすいように改良して下さい。

サンプル:
unsigned int bit = (1 << (sizeof(int) * 8 - 1));
int value = 12345; ←これが表示したい int 型の整数値です。

printf( "value の 2進表記は " );

for ( ; bit != 0 ; bit >>= 1 ){
 if ( value & bit ){
  putchar('1');
 }
 else{
  putchar('0');
 }
}
printf( " です。\n" );

最後に:
・1バイトが 8 ビットの環境が前提です。→まぁ、普通は 8 ビットですが…。
・上記のサンプルを関数などにすれば使いやすくなります。→print_bin()など
・以上。おわり。

★2進整数を表示する関数を自作すればよい。
・作り方は簡単で、最上位ビットから順に『0』と『1』を調べていき、ビットが
 立っていれば『putchar('1');』にして、ビットが OFF なら『putchar('0');』
 にすれば良いでしょう。
・下にサンプルを載せますので使いやすいように改良して下さい。

サンプル:
unsigned int bit = (1 << (sizeof(int) * 8 - 1));
int value = 12345; ←これが表示したい int 型の整数値です。

printf( "value の 2進表記は " );

for ( ; bit != 0 ; bit >>= 1 ){
 if...続きを読む

QEnterキーを押されたら次の処理に移るという事をしたい。

コンソールアプリケーション上で文字列を表示させた後、ユーザーがエンターキーを押したら次の文字列を表示するという仕様にしたいのですが、エンターキーだけ入力待ちにするっていうのはどのように書けばいいんでしょうか?

Aベストアンサー

#include <stdio.h>

int main(void)
{
char *str[] = {"abc", "def", "ghi", "jkl"};
int i;

for(i = 0; i < 4; i ++){
while(getchar() != '\n') ;
puts(str[i]);
}
return 0;
}


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング