根据http://linux.die.net/man/3/sprintf和http://www.cplusplus.com/reference/cstdio/sprintf/ sprintf()
和family返回写入成功的字符数。失败时,返回一个负值。我假设如果格式字符串格式错误可能会发生错误,因此负返回值可能表示malloc()
错误以外的其他内容。是否errno
设置为指示错误是什么?
问问题
7114 次
2 回答
11
errno
C++ 遵从 C 和 C 在和族的描述中没有要求或提及sprintf()
(虽然对于某些格式说明符,这些函数被定义为 call mbrtowc()
,可以设置EILSEQ
在 中errno
)
POSIX 要求设置 errno:
如果遇到输出错误,这些函数应返回负值并设置
errno
为指示错误。
明确提到了 EILSEQ、EINVAL、EBADF、ENOMEM、EOVERFLOW:http: //pubs.opengroup.org/onlinepubs/9699919799/functions/fprintf.html
于 2013-02-08T17:39:35.300 回答
5
当我有这样的问题时,我总是喜欢“试试看”的方法。
char buffer[50];
int n, localerr = 0;
n = sprintf(buffer, "%s", "hello");
localerr = errno; // ensure printf doesn't mess with the result
printf("%d chars\nerrno: %d\nstrerror:%s\n", n, localerr, strerror(localerr));
> 5 chars
errno: 0
strerror: Success
n = sprintf(buffer, NULL, NULL);
localerr = errno;
printf("%d chars\nerrno: %d\nstrerror:%s\n", n, localerr, strerror(localerr));
> -1 chars
errno: 22
strerror: Invalid argument
看起来它是在 linux 上使用 gcc 编译时设置的。所以这是很好的数据,并且在它的手册页中errno
确实提到printf()
(与 相同的系列sprintf()
)可能会改变errno
(在底部的示例中)。
于 2013-02-08T18:01:41.483 回答