【问题标题】:How to use scanf without determined amount of input如何在没有确定输入量的情况下使用 scanf
【发布时间】:2013-05-31 16:39:24
【问题描述】:

我已经为此搜索了一段时间,但找不到答案。如果有人知道该怎么做,我将不胜感激!

问题:我必须编写一个程序来存储一些数字,但我不知道会有多少数字!我该怎么办?

我想知道我是否可以利用时间来完成任务。我的意思是,如果 5 秒过去了并且没有数据输入,那么就开始处理这些数字。它会起作用,但我无法编写代码。有人可以帮忙吗?

【问题讨论】:

  • 通常你会期望某种终结者,例如CR/LF 或文件结尾。你有什么理由不能依赖这个吗?
  • 如果您使用 C++ 编写,您可能不应该使用scanf()。如果您使用 C 语言编写,您可能最好使用 fgets()getline() 然后 sscanf() 而不是直接使用 scanf()。如果你使用scanf(),那么while (scanf("%d", &x) == 1) { ...save x into dynamically allocated array... } 就可以了。
  • 用户将“手动”输入数据,不能要求任何类型的终止符。顺便说一句,我正在写 C。
  • 在程序中输入数据时,要么有一个“sentinel”值(例如非数字字符串)标记数字输入的结尾,要么键入 control-D(Unix -- Windows 上的 Control-Z) 让程序知道没有更多的输入,或者您从文件重定向输入并且您的程序在文件完成时获取 EOF。
  • 感谢您的回答!难道没有办法在输入和另一个之间进行“计时”吗?

标签: c input scanf


【解决方案1】:

1) 第一种解决方案:

您可以要求用户在开头输入所需元素的数量。

2) 第二种解决方案:

保留扫描号码,直到您从用户那里获得EOF。并将输入数字存储到链表或动态分配的数组中(使用 realloc 调整数组大小)

3) 第三种解决方案

保持扫描号码超时。如果在超时期间没有输入,则程序将认为用户已完成输入数字,然后程序停止从标准输入读取。如第二种解决方案所示,输入数字可以存储到链表或动态数组中。将select()scanf() 一起使用,以添加此answer 中指示的超时行为

【讨论】:

  • 您好,谢谢您的回答! 1)不能那样做,输入数据不会有数字的数量。 2) EOF 不仅在读取 FILE *f 时返回?提前致谢!
  • (1) 用户不擅长计数;要求“多少”的程序不好用——尽管每个编程练习似乎都这样做。在您可以依赖检测 EOF 之前,这可能是 Fortran 66 时代的遗物。 (2) 为什么是链表?为什么不是动态分配的数组?
  • @JonathanLeffler 也是一个很好的解决方案。我会更新我的答案,谢谢
  • 是的,@JonathanLeffler。我也喜欢第二种解决方案。我注意到您的问题评论中的循环不需要检测EOF;在这种情况下,它会处理所有scanfs 故障。我更喜欢这样。
  • @NickollasAranha 用户可以通过标准输入输入 EOF,对于 Linux 使用 CTRL+D,对于 Windows 使用 CTRL+Z
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 2019-06-09
  • 2020-05-24
  • 1970-01-01
相关资源
最近更新 更多