根据http://linux.die.net/man/3/sprintf和http://www.cplusplus.com/reference/cstdio/sprintf/ sprintf()
和家人返回成功时写的字符数。失败时,返回负值。我认为如果格式字符串格式错误可能会发生错误,因此负返回值可能表示除malloc()
错误之外的其他内容。 errno
是否设置为指示错误是什么?
答案 0 :(得分:9)
C ++遵循C而C在errno
和系列的描述中不要求或提及sprintf()
(尽管对于某些格式说明符,这些函数被定义为调用mbrtowc()
,可以在EILSEQ
)中设置errno
POSIX要求设置errno:
如果遇到输出错误,这些函数将返回负值并设置
errno
以指示错误。
EILSEQ,EINVAL,EBADF,ENOMEM,EOVERFLOW明确提到:http://pubs.opengroup.org/onlinepubs/9699919799/functions/fprintf.html
答案 1 :(得分: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
相同的家庭)可能会更改{{1}}(在以下示例中)底部)。