繁体   English   中英

在哪些情况下 printf 返回负值?

[英]In which cases does printf return a negative value?

出于教育目的,我一直在开发自己的 printf 版本,在阅读手册时,我读到 function 在遇到错误时可以返回负值。

起初我认为当格式字符串中发生错误时它会返回 -1 / 负值,但事实并非如此。

我开始认为它在遇到一些系统调用错误并且没有成功写入文件描述符时返回-1,然后我测试了这段代码来验证这个想法:

#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    errno = 0;
    int stdout2 = dup(STDOUT_FILENO);
    close(STDOUT_FILENO);
    int ret = printf("Hey", "Hello");
    fprintf(stderr, "%d\t%s\n", ret, strerror(errno));
}

它输出:

3       Bad file descriptor

设置了 Errno,实际上有错误(文件描述符关闭)但没有输出负值。

我在 Linux 上并使用 glibc,但我在 MacOS 中也遇到过这种情况。 任何想法?

在哪种情况下 printf 返回负值?

C 标准说(C99 草案):

printf function 返回传输的字符数,如果发生 output 或编码错误,则返回负值

POSIX 标准说:

如果遇到 output 错误,这些函数应返回负值并设置 errno 以指示错误。

所以我阅读了你所有的评论,感谢彼得,我像这样关闭了标准

#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    errno = 0;
    fclose(stdout);
    int ret = printf("Hey", "Hello");
    fprintf(stderr, "%d\t%s\n", ret, strerror(errno));
}

它最终返回-1。 但是我很惊讶 printf 不检查系统调用的值并在它们出现时将它们威胁为错误(因为当我直接关闭文件描述符时 printf 不起作用并将 errno 设置为 Bad File Descriptor 但返回数字字符而不是错误)。 感谢您的所有回答。 抱歉,如果我留下了一些我刚刚在凌晨 4 点测试的凌乱代码哈哈。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM