getchを本質的に標準のC関数としてインクルードできないようにするには?getchは移植できないのはなぜですか?
コンソールインターフェイスにはとても直感的でエレガントです。それがなければ、ユーザーが複数のキーを入力することが許可されているため、1文字を要求することは常に誤解を招きます。
さらに悪いことに、標準入力としても提供されていないコンソール入力を読み込んだ後、標準入力をクリアする必要があることがよくあります。私は自分自身を使用する必要があります!
可能性があり、単純なプログラム:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <conio.h>
int main(int argc, char **argv)
{
while (1) {
char yes_or_no;
printf("is this statement correct? 1 + 1 = 2(Y/N) $ ");
yes_or_no = tolower(getch());
switch (yes_or_no) {
case 'y':
puts("Right!");
goto done;
case 'n':
puts("\nhint> Please just say yes for the sake of this demo...");
break;
case 'q':
puts("\nExitting.");
goto done;
case EOF:
puts("\nEOF.");
goto done;
default:
printf("\nunknown response '%c'.\n", yes_or_no);
break;
}
}
done:
return 0;
}
は次のようになります。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
static inline void flush_stdin()
{
char ch;
do {
ch = getchar();
} while ((ch != '\n') && (ch != EOF));
}
int main(int argc, char **argv)
{
while (1) {
char yes_or_no;
printf("is this statement correct? 1 + 1 = 2(Y/N) $ ");
yes_or_no = tolower(getchar());
switch (yes_or_no) {
case 'y':
puts("Right!");
goto done;
case 'n':
puts("hint> Please just say yes for the sake of this demo...");
break;
case EOF:
puts("EOF.");
goto done;
default:
printf("unknown response '%c'.\n", yes_or_no);
break;
}
flush_stdin(); /* remove this to see the difference */
}
done:
return 0;
}
私はシンプルなポータブルコンソールプログラムを作りたいたびに、私はそのような機能の束を作るに強制的に感じます、そしてまだ私が望むすべてのものを持っていない、getchのように。
もちろん、cursesを使用することもできますが、cursesはコンソール全体を引き継ぎ、通常のユーザーが期待しているものとは異なる動作をします(プログラムをスクロールするだけで、コンソールバッファ)。
私は「なぜ」が悪い質問であるかを知っていますが(常に好むべきことは何ですか)、質問する必要があります。 getchに本質的に移植不可能なものがありますか?デスクトップシステムでサポートできませんか?もし存在しなければ、私は自分自身を書いて、私がサポートしたいすべてのプラットフォームに移植することができ、私は良いです。
デスクトップシステムでサポートされていないgetchがある場合は、それは何ですか?ですから、私は、なぜ「ncurses/conioは標準ではありません」よりも、conioが避けられる理由を理解する良い理由があります。
Btwの場合、 'ch'は' int'型でなければなりません。 – pzaenger
フォーマットされたI/O( 'scanf' /' printf')とフォーマットされていないI/O( 'getchar' /' putchar')を混ぜることを避けようとすれば、それは必要ありません。 – edmz
@pzaenger私は知っていますが、EOFとの比較を避けるためにcharを作成しました。無効にしたのは、1バイトではなく4バイト全体を比較し、追加のキャストを追加するためです。それはよくある間違いです。 -black:その詳細は明白ではなく、ユーザーフレンドリーなライブラリ設計の考慮事項を避けて回避できる微妙なバグがあります。 – Dmitry