【发布时间】:2016-06-16 14:03:37
【问题描述】:
我正在处理this answer。我遇到了一个难题:scanf has an assignment suppressing '*':
如果存在此选项,则函数不会将转换结果分配给任何接收参数
但在 get_time 中使用时,'*' 在 Visual Studio、libc++ 和 libstdc++ 上会出现运行时错误:str >> get_time(&tmbuf, "%T.%*Y"),所以我认为它不受支持。
因此,我选择通过两次读取tmbuf.tm_year 来忽略输入:
str >> get_time(&tmbuf, "%H:%M:%S.%Y UTC %b %d %Y");
This works 似乎是我唯一的选择,因为 get_time 不被接受,因为 '*' 不被接受。但众所周知,仅仅因为它有效并不意味着它已被定义。有人可以确认:
- 在
get_time中定义了两次赋值同一个变量 - 将始终从左到右读取流,因此
%Y的第一个st事件将被踩踏,而不是第二个nd
【问题讨论】:
-
get_time与scanf无关。是什么让您认为scanf规则适用于get_time?至于重复赋值的有效性,标准并没有说它是无效的,并且还规定格式元素从左到右一个一个地处理。事实上,它指定了处理格式字符串的确切算法。该算法可以毫无错误地处理此类情况。 -
@n.m.我将带着渴望的想法去回答你的问题。但听起来好像这是安全的?也许您会受到启发将其输入答案?
标签: c++ scanf undefined-behavior suppress gettime