【问题标题】:C - printf and scanf - How do I terminate input?C - printf 和 scanf - 如何终止输入?
【发布时间】:2010-08-30 02:55:59
【问题描述】:

我正在开发一个用 C 编写的简单应用程序。我在 Unix 环境中工作。

我的应用程序正在执行一些简单的 I/O。我使用 printf 提示用户输入,然后使用 scanf 获取该输入。

问题是,在输入值后,我不知道如何告诉我的应用程序我已准备好继续。键入 'enter' 提供了一个有意义的换行符 '\n'。 Control-d 确实允许 scanf 捕获我的输入,但似乎忽略了任何后续的 scanf 指令。

谁能帮帮我?

printf("Enter name\n");
scanf("%s",input);
printf("%s",input);

printf("enter more junk\n")
scanf("%s",morestuff); /* cntrl+d skips this*/

【问题讨论】:

  • Enter 不仅添加了一个 '\n' 还刷新了缓冲区。 IO 等待直到缓冲区已满或手动刷新。

标签: c++ c stdio


【解决方案1】:

检查来自scanf() 的返回值。一旦它获得 EOF(由于您键入 control-D),它每次都会失败,直到您清除错误为止。

谨慎使用scanf();我发现在现实世界中使用它太难了,因为它不能让我控制我认为我需要的错误处理。我建议使用fgets() 或等效的读取数据行,然后使用sscanf() - 一个更文明的函数 - 来解析数据。

另请参阅一个松散相关的问题:SO 3591642

【讨论】:

  • 完美。谢谢..问题是scanf中的换行符。我会研究你提到的这些其他功能。
  • 乔纳森说“谨慎使用 scanf()”是出于慈善;相反,我会选择“像瘟疫一样避免它”:-) 天真地使用 scanf(没有字段宽度限制的 %s 格式)是等待发生的缓冲区溢出错误。
【解决方案2】:

[编辑:这个答案不正确,如下所述,我也在学习]

你试过 CTRL-Z 吗?

这会将 EOF 发送到 scanf,根据其手册页,它应该使 scanf 移动到下一个字段。由于您只输入了一个字符串作为输入格式,因此应该终止 scanf。

我现在无法测试,但你可以试一试。

手册页在这里:

http://www.slac.stanford.edu/comp/unix/package/rtems/doc/html/libc/libc.info.scanf.html

【讨论】:

  • 在 Unix 上从终端发送 EOF 的正常默认值是 Control-D;在 DOS 上,它是 Control-Z。当然,您可以使用“stty eof ^Z”将 Unix 设置为模仿 DOS。然而,更典型的是,Control-Z 用于暂停当前(前台)进程并让您使用 shell 执行操作。
  • 谢谢,总是乐于学习新的东西(或者在这种情况下,重新学习一些东西)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
相关资源
最近更新 更多