当用户在 scanf() 中输入错误的数据类型时如何修复无限循环?

2024-01-06

C初学者在这里。对于下面的程序,每当用户输入字符或字符串时,它就会进入无限循环。在仍然使用 scanf 的情况下如何解决这个问题?与使用 scanf 相比,编写该程序的更好方法是什么?感谢那些愿意回答的人。

#include <stdio.h>
#include <ctype.h>

int main() {

int rounds = 5;

do {
printf("Preferred number of rounds per game. ENTER NUMBERS ONLY: ");
scanf("%d", &rounds);   
} while(isdigit(rounds) == 0);

return 0;   
}

使用“scanf”需要对输入进行格式化。 Scanf 处理错误输入的能力非常有限。常见的解决方案是使用 fgets/sscanf,遵循以下结构:

   char buff[256] ;
   int rounds = 0 ;
   while ( fgets(buff, sizeof(buff), stdin) ) {
      if ( sscanf(buff, "%d", &rounds) == 1 ) {
          // additional verification here
          break ;
      } ;
   } ;
   // Use rounds here ...

fgets/sscanf 将允许从解析错误中恢复 - 错误的输入行将被忽略。根据要求,这可能是可接受的解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当用户在 scanf() 中输入错误的数据类型时如何修复无限循环? 的相关文章

  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • asp.net 文本框文本模式数字,仅允许数字

    我只是想知道 ASP NET 中是否有一种方法只允许文本框中的数字textmode number 当我使用这个时
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • 即使手动设置显示环境变量后,WSL Ubuntu 也会显示“错误:无法打开显示”

    我在 WSL Ubuntu 上使用 g 我使用 git 克隆了 GLFW 存储库 使用了ccmake命令配置并生成二进制文件 然后使用make在 build 目录中最终创建 a文件 我安装了所有OpenGL相关的库 usr ld 我不记得我
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • g++ 对于看似不相关的变量“警告:迭代...调用未定义的行为”

    考虑以下代码strange cpp include
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 剪贴板在 .NET 3.5 和 4 中的行为有所不同,但为什么呢?

    我们最近将一个非常大的项目从 NET Framework 3 5 升级到 4 最初一切似乎都工作正常 但现在复制粘贴操作开始出现错误 我已经成功制作了一个小型的可复制应用程序 它显示了 NET 3 5 和 4 中的不同行为 我还找到了一种解
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 实例化 Microsoft.Office.Interop.Excel.Application 对象时出现错误:800700c1

    实例化 Microsoft Office Interop Excel Application 以从 winforms 应用程序生成 Excel 时 出现以下错误 这之前是有效的 但突然间它停止工作了 尽管代码和 Excel 版本没有变化 我
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检

随机推荐

  • TortoiseSVN合并分支到主干

    我知道这个问题已经被问过好几次了 所以我很抱歉再次问这个问题 但我只是想确保我理解不同合并之间的区别 我是这个项目的唯一开发人员 所以我不担心重写其他人的工作 我创建了这个项目的一个分支 因为我即将添加一些新功能 并且如果我需要修复当前代码
  • 用毫秒获取文件的最后修改日期?

    我正在尝试从文件夹中获取某些文件的日期和时间 上次修改 我设法获取日期和小时 分钟 秒 但无法获取毫秒 我已经尝试以所有可能的方式格式化该列 我只得到0毫秒 到目前为止我的代码是 用户选择一个文件夹 该代码在 A 列中显示找到的所有文件名
  • Socket.IO - 无法在 Google Chrome 中加载 XMLHttpRequest

    我试图从在 Chrome 19 0 1048 46 中工作的 socket io 主页获取第一个示例 但出现错误 XMLHttpRequest 无法加载 http localhost 8080 socket io 1 t 133715619
  • 函数 driver.switchTo.frame() 在 Selenium 中不起作用

    当我尝试在 Python 中使用 Selenium 中的 Webdriver 切换到网页上的框架时 它向我显示错误 请在下面找到我的代码 driver switchTo frame frame AttributeError WebDrive
  • Android 原生代码分析

    我正在尝试分析本机 Android 代码 但我得到了 出现以下错误 我正在 Linux 机器上运行代码 tracedmdump 配置文件后处理 痕迹 静态基本块 64525 动态 基本块 87073132 静态指令 412004 动态 说明
  • Windows 批处理,仅选择用户变量

    在环境变量中 我有一个用于用户变量和系统变量的 PATH 变量 在批处理脚本中 为了向用户 PATH 变量附加新的给定路径 我需要选择当前值 不幸的是 PATH 返回用户变量和系统变量的组合 当然 我只想向用户变量添加新的自定义路径值 也没
  • Codeigniter 3.0.0 - 错误 404 页面未找到

    这是我的第一个 php 框架 我的控制器中有一个 php 文件 即 posts php 但是当我尝试运行它 localhost codeigniter index php posts 时 它显示错误 404 应用程序文件夹内的 htacce
  • Azure DevOps 拉取请求线条颜色

    I created a PR and some of lines are marked with red or green colors in newly created file Cannot find what does it mean
  • 如何重新加载 JSF 使用的 ResourceBundles?

    我想通过单击按钮以编程方式重新加载 JSF 使用的 ResourceBundles 类路径中的 ResourceBundles 即 WEB INF classes 由外部应用程序修改 并且我知道修改事件 Try ResourceBundle
  • PHP中的矩阵乘法

    尽管矩阵的顺序应该没问题 但以下代码会抛出异常 这可能是一件我无法注意到的小事 但无法弄清楚
  • Python通过鼠标点击找到最近的乌龟

    我正在使用基于海龟的网格设置创建扫雷风格的游戏 我需要找到网格内最近的单元格并显示位于其下方的图标 无论是炸弹还是数字图标 我不想做到精确 我只需要单击鼠标即可找到网格中最近的单元格 即使单击不是直接在板上 目前 我的代码仅显示板上创建的最
  • 如何读取 Bash 中的任意一个键?

    我可以得到read n 1 KEY获取大多数键 但由多个字符表示的键除外 例如 如果我按向上箭头键 read n 1 echo A A As you can see read only takes the Esc and the A is
  • 使用 Python 加载 CloudFormation YAML

    我有一套YAML我最近转换的 AWS Cloudformation 模板JSON 使用时JSON我能够加载这些模板并使用它们进行转换jinja从中生成一些 Markdown 文档 我正在尝试做同样的事情YAML在Python中 我在 clo
  • 带回调的forceUpdate() 与 this.setState()

    原因是在处理时state具有自己功能的变量 我能想到的有两种方法 一是变异this state直接 嗯 有点 我知道这是不鼓励的 通过调用状态函数 然后调用forceUpdate 并处理由此带来的后果 另外就是做回调函数 哪个是正确的方法
  • Android:从顶部开始圆形进度条(270°)

    我使用以下可绘制对象定义了一个圆形进度条 ciruclar progress bar xml
  • 符合标准的方式来定义我的枚举

    在没有明确正确确定枚举范围的情况下 如何摆脱警告 符合标准的代码将与foo bar mUpload see here https stackoverflow com questions 514194 using enum inside ty
  • 值得学习使用 MSBuild 吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我只是想知道人们是否认为值得学习使用 MSBuild 语法来自定义 net 项目的构建过程 或者考虑到使用 Visual Studio 构建项目
  • 对 javascript 中的“this”关键字感到困惑

    我已经很长时间没有使用 Javascript 了 今天又重新学习了它 一直让我着迷的一件事是this关键词 我知道在 jQuery 事件处理程序中 例如单击事件 this指的是触发事件的元素 怎么this传递给我作为回调提供的函数 即使我的
  • 在 bash 调试运行期间隐藏信息

    我们在 shell 脚本中进行 debug run bash x my script sh 来了解 显示它正在做什么 但这样做可能会显示一些我不想看到的敏感信息 例如密码 我的脚本从安全保管库中提取密码 并在需要时将其作为脚本中的变量传递
  • 当用户在 scanf() 中输入错误的数据类型时如何修复无限循环?

    C初学者在这里 对于下面的程序 每当用户输入字符或字符串时 它就会进入无限循环 在仍然使用 scanf 的情况下如何解决这个问题 与使用 scanf 相比 编写该程序的更好方法是什么 感谢那些愿意回答的人 include