1

2次元配列を設定するために2つの整数を入力する必要があるプログラムがありますが、文字を入力するとプログラムが機能しません。

入力した数字かどうかを確認したり、キーボードで押す数字を数字だけに制限したりする方法はありますか?

数値を入力すると、変数にスキャンされて配列が設定されます。

コードの例を次に示します。

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int x;
int y;

int main(void){

    int array[x][y];
    int i;
    int j;
    srand(time(NULL));


printf("Please Enter Size X Of Array:");
scanf("%d",&x);
printf("\n");
printf("please Enter Size Y Of Array:");
scanf("%d",&y);


    printf("\n Randomised Numbers Table \n\n");

    for (i = 0; i < x; i++){

        for (j = 0; j < y; j++){
            array[i][j] =(rand()%10000);
            printf("%d \t", array[i][j]);
4

4 に答える 4

1

これに対処する最良の方法は、有効な入力が得られるまでループすることです。bashを使用すると、正規表現演算子を使用して、続行する前に文字列が有効であることを確認できます。

# Loop until your input is valid.
unset REPLY
until [[ $REPLY =~ ^[0-9]{2}$ ]]; do
    read -p 'Digit: '
done
echo "You entered: $REPLY"
于 2012-05-04T23:01:14.670 に答える
0

これは、さまざまな*ixで単一文字のエコーされていないttyI/Oを実行するCの例です。ifdefを介して、3つの異なる方法でそれを行う方法を知っています。

http://stromberg.dnsalias.org/~strombrg/ttype/

今日はおそらくtermiosを使用できます。

于 2012-05-05T00:47:16.203 に答える
0

最も簡単な方法:selectを使用します:

select a in {20..40}
do
  select b in {5..10} 
  do  
    echo $((a*10+b))
  done
done

無効な入力は自動的に拒否されます。 Ctrl+を使用Dして終了します。

これは組み込みであることに注意してselectくださいbash

于 2012-05-05T22:14:39.690 に答える
0

これは古い質問であり、宿題であり、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ビットバージョンを作成することもできます。

于 2012-09-24T17:15:25.020 に答える