sprintf()负返回值和errno

时间:2013-02-08 17:32:55

标签: c printf errno

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

2 个答案:

答案 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}}(在以下示例中)底部)。