【问题标题】:in C programming, how to print 1 character [closed]在 C 编程中,如何打印 1 个字符 [关闭]
【发布时间】:2014-07-15 04:34:28
【问题描述】:

我做了以下操作,但它跳过了我必须输入字符的部分,我不明白我的错误是什么。有什么帮助吗?

#include <stdio.h> 
main()
{
  int num;
  float f;
  char c;

  printf("Input an integer: ");
  scanf_s("%d", &num);

  printf("Input an floating point number: ");
  scanf_s("%f", &f);

  printf("Input a character: ");
  scanf_s("%c", &c);

  printf("\nThe number is: %d\n",num);
  printf("\nThe floating point number is: %f\n", f);
  printf("\nThe character is: %c\n", c);

  return 0;
}

【问题讨论】:

  • 那么您是在询问打印您在标题中所说的字符,还是询问读取您在文本中所说的字符?
  • 问题/标题可能有点模糊,但问题不是。这是scanf() 和换行符的标准问题。我确定有数百个重复项,但我找不到任何 ATM...
  • scanf_s("%c", &amp;c); --> scanf_s(" %c", &amp;c, 1);
  • 非常感谢,它确实有效。

标签: c


【解决方案1】:
 scanf_s("%d", &d);

这会读取符合"%d" 格式的字符。不适合该格式的第一个字符是您输入的换行符。这保留在输入流中。

 scanf_s("%f", &f);

跳过前导空格(即换行符),然后读取符合"%f" 格式的字符。不适合该格式的第一个字符是您输入的换行符。这保留在输入流中。

 scanf_s("%c", &c);

这会从输入中读取一个字符而不跳过潜在的前导空格,即您的换行符。

这也是未定义的行为:scanf_s() 与标准scanf() 的不同之处在于它需要%c%s 的“缓冲区大小”数字参数,以避免缓冲区溢出。不提供该参数会使scanf_s() 从堆栈中拉出一个整数,而你没有放一个整数,从而导致未定义的行为。如果下一个内存地址碰巧为零,我敢打赌你会摸不着头脑...

【讨论】:

  • 很好的解释。我将在我的网站中链接这个答案(我在下面链接)。
  • 请参阅 Survaf93 和 G.Samaras,他们提供了有关如何在调用 %c 之前跳过前导空格的建议。
  • 非常感谢分享知识!
  • @user3676215:没问题。这(输入流中剩余的换行符)实际上是最常见的初学者错误之一。
【解决方案2】:

如果我没记错的话,您的 scanf_s("%c", &amp;c); 会从上一个输入中读取“\n”字符。

你可以做的是在 %c 之前添加 1 个空格:

scanf_s(" %c", &c);

这将解决您的问题。请记住,如果在先前输入后读取字符,则需要这样做。 经过测试并且可以工作。

【讨论】:

  • 在这种情况下空格是什么意思?
  • @WileTheCoyot:“跳过前导空格”。 %c 默认不做什么,但 %d%f 做什么。 (因为空格在数字中无效,但在有效字符中。)
  • @DevSolar 这也可以应用于 %s 吗?
  • @WileTheCoyot:格式规范中的一个或多个空格匹配输入中任意数量的空格。后面跟什么样的转换说明符无关紧要。
  • @DevSolar 感谢您的解释
【解决方案3】:

指定尺寸。使用这一行:

scanf_s("%c", &c, 1);

应该可以了!

【讨论】:

  • 附加参数很好,但没有解决真正的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多