如何修复整数输入中的任何字母或整体字符输入

问题描述 投票:0回答:2

所以基本上我有一个简单的代码,我在其中使用方矩阵,其中随机生成矩阵,或者用户可以在矩阵中输入数字,但是当我输入它的大小时,例如在这个 do-while 中:

 do {
                     printf("Define the size of the matrix: ");
                     scanf("%d", &n);
                         } while (n <= 1);  

循环会循环直到我输入任何大于 1 的数字,但是当我输入任何字母或数字以外的字符时,它会陷入无限循环。

我在用户输入矩阵中的数字的其他功能中遇到同样的问题:

void input_matrix(double* matrix, int n) {
    for (int i = 0; i < n; i++) 
    {
        for (int j = 0; j < n; j++) 
        {
            printf("Define the value of %d. row a %d. columm:\t", j+1 ,i+1);
            scanf("%lf", &matrix[i*n+j]);
        }
    }
}

我不知道如何解决它,有什么简单的方法可以解决我的问题吗?

(对不起,我的英语不好,不是母语人士)。

我尝试在互联网上寻找答案,找到了,但不知道如何在我的代码中实现它。

c function input scanf do-while
2个回答
0
投票

你可以检查

scanf("%d", &n);
的响应,如果它小于1,那么它没有得到一个整数,所以我们需要从缓冲区中删除它。

int n;
do {
   printf("Define the size of the matrix: ");

   int args = scanf("%d", &n);
   if (args < 1)
   {
      char dummy;
      scanf("%c", &dummy);  // eats a character off the buffer
      n = 0;
   }
} while (n <= 1);  

0
投票

我通常会使用

fgets
来读取字符串,然后尝试将数据转换为字符串的预期类型。如果成功,那就太好了。否则,重复。

与直接使用

scanf
(和公司)不同,它总是读取数据,因此它不会像直接使用
scanf
那样在输入中“卡住”。

int getInt(char const *prompt) { 
    static char buffer[1024];
    int retval;

    do {
        printf("%s", prompt);
        fgets(buffer, sizeof(buffer), stdin);
    } while (scanf("%d", &retval) != 1);
    return retval;
}

这会像这样使用:

int n = getInt("\nDefine the size of the matrix: ");

演示输入错误数据,最终可用数据:

Define the size of the matrix: asdf

qwere

Define the size of the matrix: qwerpoiusadf

Define the size of the matrix: 1234

Size: 1234

与直接使用

scanf
的基本区别在于,这从将一行数据读入
buffer
开始。它根本不关心这些数据到底是什么,只是读取您在下次按下 return/enter 键之前输入的任何字符。

然后,在读取该数据后,它会尝试将其转换为整数。但重要的是,不管转换成功与否,数据已经全部从系统的输入缓冲区读入到我们提供的

buffer
中了。所以下次我们调用它时,它会尝试读取另一行新的数据。

相比之下,当你直接使用

scanf
时,如果你试图转换一个整数,它会“偷看”输入,如果它是一个不能构成整数一部分的字母,它就会被简单地留下在系统的输入缓冲区中,因此如果您尝试再次调用
scanf
,它将尝试再次处理相同的输入。如果您再次尝试将其转换为整数,它将再次失败——而且无论您尝试将其转换为整数的频率如何,它都会继续失败。

© www.soinside.com 2019 - 2024. All rights reserved.