【发布时间】:2013-10-05 18:17:01
【问题描述】:
根据我对 C 标准的阅读,如果 snprinf 在写入时达到 maxlen,它将返回一个正值或负值(实际上并不清楚),其大小等于失败的字符数要写。规范还说,该函数将为任何错误返回负值。所以我的问题是:在以下两种情况下它会返回什么......
Maxlen > 0,在发生错误之前没有写入任何字符,snprintf 保释
Maxlen > 0,所有字符都已写入,出现某种错误,snprintf 保释
我意识到,尤其是最后一个,不太可能。但我想更好地理解规范。在我看来,snprintf 的返回使您是否正确编写了字符串的一部分变得模棱两可。
- 编辑
显然这并不清楚。让我详细说明:
*> 哪个负数无关紧要。错误就是错误,它没有
在发生之前写入了多少字节。 这可能是大多数人的实际情况。但是,我看到 snprintf 应该返回多余字符的数量,我想知道是否可以使用该值。 我觉得很奇怪,规范会遇到麻烦报告一些有用的东西,只是让它模棱两可,它是否真的返回了一些不相关的东西。这没有意义吗? 我想知道约定是否有更多内容可以确定 snprintf 是否因为输入过多而失败。*
我现在明白了。我看到除截断以外的任何错误都是负数,成功是 0
【问题讨论】:
-
"如果输出由于此限制而被截断,则返回值是字符数(不包括终止的空字节),如果有足够的可用空间,它将被写入最终字符串。 "这有什么歧义?
-
你没有阅读我问题中间的两行。
-
我做到了,但我仍然不确定你为什么感到困惑。
-
历史:在 snprintf() 和朋友被 C89/C90 标准化之前,(not-yet standard) 函数的返回值有两种约定。一个总是返回-1,另一个使用大于第二个参数的值来给调用者一个提示。最后一个被标准采用。 (但您仍然必须检查返回值
-
1.规范表明截断是一种错误,但是关于 glibcn 版本的评论表明截断返回正值并且不表示错误。更重要的是,它从未明确表示截断是一个错误。 2.无论标准是否模糊,返回值中的信息似乎都是。