14

根据http://linux.die.net/man/3/sprintfhttp://www.cplusplus.com/reference/cstdio/sprintf/ sprintf()和family返回写入成功的字符数。失败时,返回一个负值。我假设如果格式字符串格式错误可能会发生错误,因此负返回值可能表示malloc()错误以外的其他内容。是否errno设置为指示错误是什么?

4

2 回答 2

11

errnoC++ 遵从 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 回答