gpt4 book ai didi

c - Scanf 接受不正确的输入

转载 作者:行者123 更新时间:2023-11-30 16:06:52 25 4
gpt4 key购买 nike

这是 scanf 似乎无法正确获取输入值的唯一代码块。它在第一次执行代码时总是按设计工作。当它第二次询问时(执行一次 newGame 后),无论您输入什么,它总是采用值 1,然后在无限循环的第二次迭代中它可以正常工作。使用指针并没有像我想象的那样有帮助。

编辑:为新读者更新了代码,这也不起作用

void newGame(void){
int option;
puts("Would you like to play a new game? 1: Yes 2: Return to the main menu");

while (1) {
scanf("%d", &option);

switch(option) {
case 1:
newGame();
break;
case 2:
return;
default:
printf("Invalid input %d!\n", option);
break;
}
}

最佳答案

如果我正确理解观察到的不当行为,它的表现如下(例如):

  1. 函数发出提示
  2. 您输入“1”并按 [enter]
  3. 函数发出提示
  4. 您输入“2”并按 [enter]
  5. 似乎什么也没发生
  6. 您输入“2”并按 [enter]
  7. 在首次调用 newGame() 后,控制权传递到下一条语句

至少,这是所提供函数的可观察行为。解释该问题以描述问题时假设 (5) 处的“似乎没有发生任何事情”就是问题所描述的“无论您输入什么内容,它总是采用值 1”。我发现很难协调这些问题,但我认为所提供的代码实际上体现了问题,因此我必须以某种方式将声明与实际行为联系起来。

该特定行为(必须键入“2”两次或多次才能返回主菜单)是由函数的递归实现引起的。事情是这样的:

  • 控件在首次调用函数时进入该函数。
  • 该函数打印提示。
  • 函数进入 while 循环,其中:
    • 它会扫描用户的选择(如果用户输入了任何非数字内容,那么届时或以后将会遇到麻烦);
    • 用户输入“1”,函数递归调用自身,其中新的执行
      • 打印提示,
      • 进入while循环,
      • 扫描用户的输入(这次是“2”),
      • 从递归调用中返回
    • (返回顶层 newGame() 执行)函数到达 while 循环的底部并循环返回以扫描新输入(另一个“2 “在示例 session 中)。
    • 该函数从 newGame() 的顶层执行返回。

修改代码以便用户只需选择选项“2”一次的最简单方法是在递归调用之后立即添加一个 return 语句newGame()。在用户选择选项“2”之前,递归调用不会返回,因此在这种情况下不需要循环返回更多输入。

但是最好的解决方案是将菜单系统构造为非递归的。在现实世界的程序中,递归几乎从来都不是正确的答案。即使在这种情况下,递归方法也会对在程序溢出堆栈之前可以连续玩多少个游戏设置(取决于系统)限制。这可能是数百甚至数千,但根本不需要有任何限制。

关于c - Scanf 接受不正确的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59829573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com