簡體   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