C语言 我怎样才能修复任何字母或整体字符输入在整数输入

zxlwwiss  于 2023-04-29  发布在  其他
关注(0)|答案(2)|浏览(142)

所以基本上我有一个简单的代码,其中我使用方阵,其中矩阵是随机生成的,或者用户可以在矩阵中输入数字,但是当我输入它的大小时,例如在这个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]);
        }
    }
}

我不知道怎么解决,有没有简单的方法可以解决我的问题?
(抱歉我的英语不好,不是母语)。
我试着在互联网上寻找答案,找到了,但不知道如何在我的代码中实现它。

wb1gzix0

wb1gzix01#

你可以检查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);
bihw5rsg

bihw5rsg2#

我通常使用fgets读取字符串,然后尝试将数据转换为字符串,并转换为预期的类型。如果成功了,那就太好了。否则,重复。
与直接使用scanf(和company)不同,它总是读取数据,因此不会像直接使用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中。它并不关心这些数据到底是什么,只是读取你输入的任何字符,直到你下一次按回车键。
然后,在读入数据后,它尝试将其转换为整数。但重要的一点是,无论转换是否成功,数据都已从系统的输入缓冲区读入我们提供的buffer。因此,下次调用它时,它将尝试读取另一个新的数据行。
相比之下,当你直接使用scanf时,如果你试图转换一个整数,它会“偷看”输入,如果它是一个不能构成整数一部分的字母,它就会留在系统的输入缓冲区中,所以如果你试图再次调用scanf,它会再次尝试处理相同的输入。如果你再次尝试将其转换为整数,它将再次失败-无论你尝试将其转换为整数多少次,它将继续失败。

相关问题