【问题标题】:Variable scanf inputs可变 scanf 输入
【发布时间】:2017-04-08 09:38:21
【问题描述】:

您将如何处理数量可变的 scanf 输入? 我正在扫描命令,其中一些是 1. word 命令,但有些需要数字参数。 scanf 是否允许以下​​操作?

 scanf(" %s %d", command, argument);

如果只输入一个值,会忽略“参数”吗? 我想到的另一个选择是

 scanf(" %s", command)
 if (strcmp(command, "somethin") {
      scanf("%d", argument); }

但这会创建一个换行符,对吧?终端必须以“> 命令参数”的形式接收输入 所以,我的问题是,如何解决输入数量可变的问题。

【问题讨论】:

  • 第一个将等待您输入参数。使用fgets()读取一行,然后使用sscanf()解析它。
  • 您也可以阅读该行,然后使用strtok() 将其拆分为令牌,然后进行解析。
  • 你几乎肯定想读一整行然后处理那行

标签: c scanf


【解决方案1】:

不,它不会“创建换行符”。 scanf 完全不知道任何换行符。 scanf 将输入流视为由空格分隔的线性数据序列。换行符只是空格,与任何其他空格没有什么不同。唯一可以“看到”换行符的scanf 格式说明符是%c%[]。您的 %s%d 完全与换行无关。

这意味着您的第二个示例做得对(在scanf 的自然限制范围内)。它不会“创建换行符”。如果您在一行中提供输入(如somethin 42),它将读取一行。

您实际上可能会遇到“相反”的问题:如果用户忘记在一行中输入所需的参数,则下一个 scanf 将在下一行等待它。在下一行。在下一行......直到他的用户最终提供它。我不确定这种行为是否适合您。如果不是,那么更好的办法是通过fgets 使用基于行的专用输入,然后手动解析该行。

附:没有理由在 %s%d 前面加上空格。

【讨论】:

  • 嗯,其实我现在就试过了,它的行为实际上有点奇怪。它设法逃脱和无限循环。它忽略了“if”测试,只是忽略了我作为命令输入的内容,然后继续进行基本输入。编辑: nvm 修复它。错误处理 strcmp 输入。
  • @ZergOvermind fgets 从流中读取。您可以指定 stdin 作为该流。其实scanf本质上只是fscanf(stdin,...的简写
猜你喜欢
  • 2021-12-25
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多