【问题标题】:scanf() for Integer OR Character整数或字符的 scanf()
【发布时间】:2018-04-09 05:00:55
【问题描述】:

假设我有一个 while 循环,当条件“isDone”设置为 true 时该循环将结束。在 while 循环中,我要求用户输入一个整数来继续循环,或者输入一个字符来结束它(通过将“isDone”设置为 true)。

我将如何仅使用 one scanf() 来解决这个问题?

【问题讨论】:

  • 您根本不应该使用scanf 进行用户输入。请改用fgets 或类似的东西。
  • 您只需要考虑整数输入后留在输入缓冲区中的'\n'。由于%c 格式说明符NOT 丢弃了前导空格,因此您必须在尝试读取char 之前删除'\n' 和任何其他杂散字符,例如int c = getchar(); while (c != '\n' && c != EOF) c = getchar();然后读你的性格。 (不,您不能使用相同的scanf。使用%d 将导致[0-9] 以外的任何内容匹配失败
  • @DavidC.Rankin 或者你可以养成在每个scanf 之后加入一个空的getchar() 的习惯,以咀嚼留在标准输入中的换行符。
  • 嗯,你可以,但这并不能防止用户做一些愚蠢的事情,比如输入43abcscanf ("%d", ...) 将转换43,将abc\n 留在输入缓冲区中。对于混合输入问题,这是 scanf 的旧循环射击小队——可行,但每个 IT 都必须加点。
  • " %c%d" 可以解决问题,但与fgets() 的初读相比,后期处理的数量甚至不值得进行学术练习。

标签: c scanf


【解决方案1】:

上面的建议是个好建议:你最好不要使用scanf()。最好改用fgets() 之类的东西,然后解析字符串。或者更好的是,只需使用getchar()

但无论如何...

请记住,在 C 中,“字符”一个整数。所以只需scanf("%c", &i) 并检查您是否有“整数”(isdigit())或“字符”(isalpha())。

【讨论】:

  • @David C. Rankin:很好,谢谢。我已经更新了我的帖子。
  • 是的,除非新程序员想在scanf 的杂草中走得更远——面向行的输入是要走的路。
猜你喜欢
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多