所以基本上我有一个简单的代码,我在其中使用方矩阵,其中随机生成矩阵,或者用户可以在矩阵中输入数字,但是当我输入它的大小时,例如在这个 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]);
}
}
}
我不知道如何解决它,有什么简单的方法可以解决我的问题吗?
(对不起,我的英语不好,不是母语人士)。
我尝试在互联网上寻找答案,找到了,但不知道如何在我的代码中实现它。
你可以检查
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);
我通常会使用
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
,它将尝试再次处理相同的输入。如果您再次尝试将其转换为整数,它将再次失败——而且无论您尝试将其转换为整数的频率如何,它都会继续失败。