c - Scanf 在 do-while 循环中更改了错误的数组

标签 c arrays while-loop buffer scanf

我需要有关此代码的建议。

这是程序检查数字是否在 1 到 20 之间的代码。问题出现在这几行中,因为当我进入 while 循环时,scanf() 更改了 2 中的数字数组,而不仅仅是一个数组。

第一个是numberToGuess数组,第二个是“随机”生成数字的数组(我使用了srand(time(NULL)))。随机生成器的函数仅在此代码之前调用一次。

我猜这是因为当 while 循环发生时,他从缓冲区中获取最后一个地址,但我不知道如何修复它。

while(numberToGuess[i]<1 || numberToGuess[i]>20) {

    printf("Try again:\n");
    for(i=0;i<4;i++) {
        scanf(" %d", &numberToGuess[i]);
    }
}

编辑:我找到了解决方案,它与发布的代码无关。问题发生在我声明数组的部分。数组的大小小于应有的大小(不是 4 ,而是 3 )。因此,当循环变量 (i) 等于 3 时,scanf 跳转到另一个内存位置,即第二个数组的位置并更改 1。在第二个数组上,当循环等于 3 时,他超出了数组范围并打印了一些“随机”值”。

最佳答案

您不需要内循环。另外,去掉 scanf 模式中的空格,因为 %d 无论如何都会忽略它们。

while(numberToGuess[i]<1 || numberToGuess[i]>20){
    printf("Try again:\n");
    scanf("%d", &numberToGuess[i]);
 }

关于c - Scanf 在 do-while 循环中更改了错误的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34820197/

相关文章:

java - DO.. WHILE.. 使用 SWITCH 菜单

c - 填充二叉树的每个节点中的下一个右指针

python - while 循环无条件工作

java while 循环

javascript - 如何在 Vanilla Javascript 中不修改源数组的情况下找到数组的最后一个元素

php - 从 Paypal 支付意图多维数组中获取值

php - 在 laravel 插入查询中,我想在数组上实现一个 for 循环以一次性插入多条记录

c - 如何使用结构在 C 程序中打印此输出?

c - 应该始终使用 memcpy 吗?

c++ - 使对象恰好位于屏幕中央