• ベストアンサー

標準ライブラリだけでgetch関数を作成する方法

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

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.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);

daigakusei12345
質問者

お礼

ありがとうございます。

その他の回答 (1)

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.1

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

daigakusei12345
質問者

お礼

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

関連するQ&A

  • C言語の非標準コンソール関数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がどのように作用してこのようなことが起きてしまっているのか説明して頂けたら幸いです。 お手数ですが、みなさま、よろしくお願いいたします。

  • 標準ライブラリー関数を使用せずに文字出力

    はじめまして、C言語初心者です。 研修で、C言語を学ぶことになったのですが研修先から頂いた練習問題で「練習のため標準ライブラリー関数は使わない」で文字列を連結するための関数を作ることになったのですが、標準ライブラリー関数を使用せずに文字出力はできるのですか??

  • _getch()でキーボードからファイル名を入力し

    scanfを使わずに_getch()でキーボードからファイル名を入力していき、 入力した文字をprintfで表示する流れについて質問です。 表示された文字をバックスペースで消していっても打ち込んだ文字は 消えないですよね? 間違ったファイル名を入力してしまった際に文字が残っているので、 正しく入力し直しても間違ったファイル名となってします。 一度打った文字を消す方法はありますでしょうか?

  • scanf関数を用いての標準演算子(*/+-%)の入力方法

    C言語超初心者のものです。 scanf関数を用いての標準演算子(*/+-%)の入力方法について質問があります。 例:17 / 5 = 3 において ”17”、 ”/”、 ”5” を各々キーボードから入力し、”3”の数値をDOS画面?上に表示させるものです。 ”17”、”5”はscanf関数を使いキーボードから入力できるのですが、”/”だけがどうしても標準演算子として認識させることが出来ません。 私は以下のプログラムを組んでいるのですが、 char num3;  ・・・(省略) printf("Please type in a operator: "); scanf("%c",&num3);  ・・・(省略) printf("%d %c %d is %d\n", num1, num3, num2, product); 無理やりコンパイルして、DOS画面?上に表示させても17 / 5=65536となってしまいます。 ”/”をプログラミングの中で認識させて、ディスプレイ上で例式が正常に表示されるようにしたいのですが、どうしても回答が3になりません。 多分1つの標準演算子が入力できれば、他の標準演算子も入力できると考えています。 どうすればキーボードから標準演算子をプログラミングに認識させることが可能になるのでしょうか? どなたか分かる方がいらっしゃいましたら教えて下さい。 また参考になるURLなどがあればそれも教えて下さい。 よろしくお願いします。

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

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

  • 文字列として作成した関数を、関数として機能させたい

    いつも当コーナーを活用させていただいており、ありがとうございます。 通常は文字列を操作して作成した関数 ('=で始まる文字列) を、正規の関数として機能させるために、(1)F2キーで編集(2)エンターキー とするか、先頭の ' を消去して来ました。 個数が多くなると大変になりました。何かほかの手立てをご教授願いたいのですが。

  • 全角半角を調べるライブラリ関数はありますか?

    文字列検索プログラムを作成しています。 ライブラリ関数の"strcmp"を利用せず、 ==演算子で文字同士を照合しています。 問題がありまして、 検索文字列に一文字指定し検索しますと、 漢字にヒットしてしまいます。 例) 大文字(半角)   I ヒットした文字  "終"の2バイト目 この状態を改善したいのですが何かよい方法を教えてください。宜しくお願いします。

  • PHPからのライブラリ関数コール

    あちこち検索したのですが、うまくヒットしません。 Linuxにて作成したC言語のダイナミックリンクライブラリ(xxxxx.so)の関数をPHPから実行することは可能でしょうか。実現可能であれば、PHP側ではどのような手順が必要ですか。よろしくお願いします。

    • ベストアンサー
    • PHP
  • Linuxで、標準Cライブラリが読み込まれず、C言語プログラミングができません・・・

    僕の問題はタイトルの通りで、標準Cライブラリが読み込まれていないようで、C言語プログラミングができません。 ubuntuのオフィシャルから日本語ローカライズドDesktopCDをダウンロードして、空のHDDにインストールしました。 ですが、gnome-terminalからccコマンドでプログラムをコンパイルしても、標準Cライブラリにあるはずの<stdio.h>が認識されず、続くprinft関数も読んでくれません。 これはどうしてでしょうか?LinuxはデフォルトでCやらJAVAやらのプログラミングの環境が整っているものだと思っていたので、戸惑っています。何か、セットアップが必要なのでしょうか。 ちなみに、gccでも、標準ライブラリは読み込まれませんでした。

  • UNIX上のプログラムで使うライブラリの中身を知る方法

    過去にUNIX上で動作するプログラムを作成していて、その中で多数の.aや.so(標準では無く、オリジナルのもの。)を使っているのですが、.aや.so内にどのような関数があるのか、もしくはそのライブラリに関係するソース名は何か知る手段ってありませんか? かなり前のものなので、関数仕様書もmakefileも無いため、何をライブラリとしているのか分からず困っています。 駄目もとで、バイナリエディタで中身を確認してみたのですが、何処の情報がそれを示しているかいまいち分かりませんでした。

専門家に質問してみよう