1

我有一个程序需要输入两个整数来设置一个二维数组,如果你输入一个字母,那么程序就不起作用。

有什么方法可以检查它是否是已输入的数字或将键盘上按下的内容限制为仅数字?

一旦输入了数字,它就会被扫描到一个变量中以设置数组。

这是代码示例:

#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

我知道这是一个老问题,我知道这是一个家庭作业,我知道 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字符。计数器也可以很好地阻止用户用退格键擦除整行。如果我实施一个计数器,我可能会回来并发布更新。

我只在 Mac OS X 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 将使用此代码来设置二维整数数组的大小。999,999,999*999,999,999*4 字节(假设为 32 位整数)大约等于 4 艾字节,我认为我们还需要一段时间才能拥有这么多内存的计算机。如果你有一台内存这么大的电脑,我很乐意为你制作一个 64 位版本。*(我不知道你会用这样的数组做什么。)

我添加的另一件事是每当用户输入无效输入时都会发出哔哔声。认为当我们不接受他的输入时给用户一些反馈可能会很好。

*当然,我知道您可能希望将输入用于创建巨大的多维数组之外的其他用途,在这种情况下,我也很乐意为您编写 64 位版本。

于 2012-09-24T17:15:25.020 回答
0

最简单的方法:使用选择:

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

这是一个在各种 *ix 上执行单字符、非回显 tty I/O 的 C 示例。它知道如何通过 ifdef 以 3 种不同的方式进行操作。

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

您今天可能只使用 termios。

于 2012-05-05T00:47:16.203 回答