c - 防止循环中的无效数组输入

标签 c arrays input

在无效输入的情况下保护程序的问题与编程一样古老,我在这个网站上发现了很多关于这个的问题,但是对我来说没有任何帮助。

我有一个函数可以将值加载到浮点二维数组中。

void load_val(
                     float matrix[MAX_SIZE][MAX_SIZE],
                     const int line_num,
                     const int column_num
                     )
{
    for (int i=0; i<line_num; ++i)
    {
        printf("Give number\n");
        for (int j=0; j<column_num; ++j)
        {
            scanf("%f", &matrix[i][j]);
        }
    }

}

显然,当用户输入字母时,程序会进入无限循环。 我对该问题使用了两种解决方案,但均无效。 第一个是利用当存在无效输入时 scanf 返回 0 的事实。

所以代替

scanf("%f", &matrix[i][j]);

我写了

while (scanf("%f", &matrix[i][j])==1);

但它仍然给我一个无限循环。

另一种解决方案是使用 "isdigit" 函数。

int h = scanf("%f", &matrix[i][j]);
            if (isdigit(h)==0)
            {
                puts("INVALID");
                j--;
            }

但我真的不想使用其他库,它也没有用。 问题似乎是,在我什至无法检查输入是否有效之前,程序就因为输入而发疯了。

我什至尝试过这个

float h;
if (scanf("%f", &h)==1)
       {
          matrix[i][j]=h;
       }
else
       {
          puts("INVALID");
          j--;
       };

仍然 - 无限循环。 我如何才能在程序变得疯狂之前检查此 loop-inside-a-loop 中的无效输入?。可能是 float 类型的问题?

最佳答案

问题是,当您提供无效输入时,scanf 不会将其从输入缓冲区中移除。每次您在循环中调用 scanf 时,它都会一遍又一遍地读取相同的输入。

因此通常建议您使用fgets读取整行,然后使用 sscanf 解析该行。

并检查scanf(或sscanf)returns 检查是否成功的正确方法。

关于c - 防止循环中的无效数组输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53151791/

相关文章:

javascript - 更改输入 :focus 上的提交按钮不透明度

c - Makefile 将所有 *.c 转换为 *.o

php - 是否可以使用较少的代码从值列中为 PHP 中的数组元素分配键?

c - C 中的堆没有释放

java - 在二维数组上打印特定值 - Java

java - 如何编写一个返回数组中给定列的总和的方法? java

Java - 异常处理 - 如何重新输入无效输入

python - 创建 python 列表并在输入字段中显示列表项

c - 使用 printf 打印变量的内存地址时,为什么 %x 和 %p 返回不同但相似的值?

c# - 等于c#中的sprintf