【问题标题】:How can i ignore the rest of the input in C?我如何忽略 C 中的其余输入?
【发布时间】:2020-06-14 18:25:54
【问题描述】:

我正在制作一个需要接收以下输入的程序:

{Time1 Time2 Appointment} 为 {hour1:minute1 hour2:minute2 Appointment}

“约会”是一个无用的字符串输入,我想忽略它

scanf("%d:%d %d:%d",&hour1,&minute1,&hour2,&minute2);

我可以得到小时和分钟,但之后我不能再次使用“scanf”,我怎么能忽略“约会”输入?

【问题讨论】:

  • 如果您的意图是真正用 C++ 编写,正如您的问题标签所暗示的那样,您为什么要使用古老的 C 库的 scanf(),而不是现代 C++ 输入流?
  • 也许你可以试试 scanf("%d:%d %d:%d %*s",&hour1,&minute1,&hour2,&minute2);见stackoverflow.com/questions/34874347/…
  • 我在 c++ 中使用库 ,有没有办法用 {cin} 输入这个输入?
  • 如果您想忽略输入的其余部分,则只需关闭输入文件。如果您只想忽略输入到下一个换行符的其余部分,您可以在适当的格式说明符中使用*。 (例如,如果 Appointment 保证是没有空格的简单字符串,则可以使用 "%d:%d %d:%d %*s "
  • 当问题是“我怎样才能用scanf 做这个复杂的事情?”,一个好的答案总是“停止使用scanf”。对于复杂的事情,它真的不是很好。见What can I use for input conversion instead of scanf?

标签: c scanf


【解决方案1】:

你可以做 %*s 的事情,也可以在第一次 scanf 之后使用输入缓冲区。像这样的:

int minute1 = 0, hour1 = 0, minute2 = 0, hour2 = 0;
char buffer[100];

scanf("%d:%d %d:%d %99[^\n]s",&hour1, &minute1 ,&hour2 ,&minute2, buffer);
printf("%d:%d %d:%d\n", hour1, minute1, hour2, minute2);

【讨论】:

  • %[^\n]s 这将忽略字符串中的空格
  • 像这样分配输入缓冲区是有问题的:缓冲区可能不会保存输入(一个大尺寸的缓冲区应该适用于受信任的输入),并且容易出现实现错误(如发布的代码)。您的代码存在缓冲区溢出问题。 buffer 指向单个charscanf() 总是用%s 写一个\0,所以这里只能存储一个空字符串而不会溢出。即使有适当大小的分配,总是使用%s%[] 指定最大字段宽度以避免缓冲区溢出(例如,%99[^\n]s 不是@987654331 的一部分@ 指令)。
  • 最好用%*[^\n] 忽略或丢弃输入流中不需要的输入。
  • 我不确定我是否清楚:如果整数输入之后有任何“约会”输入字符串,即任何非空白字符,则此答案具有 未定义的行为 , 由于在将​​字符串写入只有一个char 的缓冲区数组时出现缓冲区溢出。
  • 忽略buffer 仅大到足以容纳空终止符的问题,没有必要使用 malloc/free。如果你这样做char buffer; scanf(" ... ", ..., &buffer);,你会得到相同的(有问题的)结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多