【问题标题】:Scanf changes wrong array when it is in do-while loopScanf 在 do-while 循环中更改错误的数组
【发布时间】:2016-01-15 21:32:29
【问题描述】:

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

这是程序检查数字是否在 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 时,他超出了数组范围并打印了一些“随机价值”。

【问题讨论】:

  • 读取字符“%c”时需要scanf中的空间
  • 您在for 循环中设置i,但您在开始循环之前访问它。那没有意义。你能展示整个代码吗?
  • 你为numberToGuess分配空间了吗?我感觉它是一个未初始化的指针。

标签: c arrays while-loop buffer scanf


【解决方案1】:

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

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

【讨论】:

  • 感谢您的建议,但代码仍然无法正常工作。
  • @tijetof “不起作用”具体是什么意思? Minimal, Complete, Verifiable Example 会有所帮助。
  • 当我说不起作用时,我的意思是程序仍然会更改第二个数组的数量。
  • @tijetof 那么问题可能出在您没有向我们展示的代码中。 MCVE,请。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 2020-08-28
  • 2016-07-30
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多