これは古い質問であり、宿題であり、OPが戻って私の答えを受け入れないことは知っていますが、この質問は私に次のプログラムを書くように促しました。これは正しい答えです。質問。
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
int getdigit() {
int total = 0;
struct termios oldtc, newtc;
int ch;
tcgetattr(STDIN_FILENO, &oldtc);
newtc = oldtc;
newtc.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newtc);
while (1) {
ch=getchar();
if (ch == 127) { // Backspace
total /= 10;
printf("\b \b");
continue;
} else if (ch == 10) { // Return
putchar(ch);
break;
} else if (ch < '0' || ch > '9') {
continue;
}
putchar(ch);
total *= 10;
total += ch-'0';
}
tcsetattr(STDIN_FILENO, TCSANOW, &oldtc);
return total;
}
int main() {
int n;
printf("Enter a number: ");
n = getdigit();
printf("You entered: %d\n", n);
return 0;
}
さあ、C
数字だけを入力として受け入れるプログラムです。すべての文字を無視します。ターミナルには表示されません。
ただし、いくつかの問題があります。整数のオーバーフローは処理しません。入力する桁数が多すぎると、正しい値が返されません。これを解決するには、カウンターを追加し、文字数を超えないようにしますx
。カウンターは、ユーザーがバックスペースで行全体を消去するのを防ぐのにも役立ちます。カウンターを実装すると、戻ってきて更新を投稿する場合があります。
私はMacOSX Lionでプログラムをテストしただけですが、ほとんどのUnix互換システムで動作すると思います。明示または黙示の保証はありません。
編集:これは、そのカウンターが実装されたバージョンです。
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
int getdigits(int limit) {
if (limit > 9 || limit < 1) limit = 9;
int count = 0;
int total = 0;
struct termios oldtc, newtc;
int ch;
tcgetattr(STDIN_FILENO, &oldtc);
newtc = oldtc;
newtc.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newtc);
while (1) {
ch=getchar();
if (ch == 127) { // Backspace
if (count > 0) {
total /= 10;
count--;
printf("\b \b");
} else {
putchar('\a');
}
} else if (ch == 10) { // Return
putchar(ch);
break;
} else if (ch < '0' || ch > '9') {
putchar('\a');
} else {
if (count < limit) {
putchar(ch);
total *= 10;
total += ch-'0';
count++;
} else {
putchar('\a');
}
}
}
tcsetattr(STDIN_FILENO, TCSANOW, &oldtc);
return total;
}
int main() {
int n;
printf("Enter a number: ");
n = getdigits(0);
printf("You entered: %d\n", n);
return 0;
}
最大(およびデフォルト)の制限は9桁です。より高い制限が必要な場合は、64ビットバージョンのメソッドを実装できます。OPはこのコードを使用して2次元整数配列のサイズを設定するため、気にしませんでした。999,999,999 * 999,999,999 * 4バイト(32ビット整数を想定)は約4エクサバイトに相当し、それだけのメモリを搭載したコンピュータができるまでにはしばらく時間がかかると思います。あなたがそれだけのメモリを搭載したコンピュータを持っているなら、私は喜んであなたのために64ビットバージョンを作ります。*(私はあなたがそのようなアレイで何をするかについての手がかりを持っているわけではありません。)
私が追加したもう1つのことは、ユーザーが無効な入力を入力するたびにビープ音が鳴ることです。ユーザーの入力を受け付けていないときに、ユーザーにフィードバックを提供するのは良いことだと思いました。
*もちろん、巨大な多次元配列を作成する以外の目的で入力を使用することもできます。その場合は、64ビットバージョンを作成することもできます。