簡體   English   中英

請問,為什么這個代碼在我運行時打印了一個額外的“n”?

[英]Please, why is this code printing with an extra “n” when I run it?

我正在嘗試使用此代碼獲取 pid。 但是當我運行編譯的代碼時。 我收到一條錯誤消息“警告:格式指定類型'unsigned long',但參數的類型為'pid_t'(又名'int')[-Wformat]”。

當我將格式說明符更改為“%lu”時,它不會打印額外的字符。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
pid_t pid = getpid();

printf("pid: %lun", pid);
}

我預計 pid 為“60316”。 我得到“60316n”的pid。

n打印出來的原因與p打印的原因相同。 n不是說明符的一部分。

      vvv  --- specifier for unsigned long 
"pid: %lun"
 ^^^^^   ^ --- non-specifier characters

在旁邊:

pid_t數據類型是帶符號的 integer類型,能夠表示進程 ID

請參閱打印 pid_t 的正確 printf 說明符是什么?

您傳遞給printf的格式字符串是普通字符和格式說明符的混合體。 普通字符本身打印,格式說明符導致額外的 arguments 之一被轉換和打印。 但是每個額外參數的類型必須與格式說明符所期望的類型或多或少完全匹配。

我們可以從警告消息中看出pid是一個int 所以正確的格式說明符是%d

如果pid的類型為unsigned long int ,則說明符%lu將是正確的。

格式說明符是它們自己的小型編程語言。 unsigned int類型的基本格式說明符是%u ,您可以修改它以打印unsigned long int ,而不是使用l (字母 ell )修飾符: %lu

但是當你寫%lun時, n實際上並不是任何格式說明符的一部分,所以它本身就打印出來了。

(另外,你很幸運:盡管pid的類型和格式說明符%lu不匹配,你還是得到了一個合理的值。)

通常,讓 arguments 和格式說明符排列起來很容易: int代表%dunsigned int代表%u%xlong int代表%ldfloatdouble代表%f等等。但是什么是正確的說明符用於具有pid_t類型的pid 今天,在您的計算機上,它看起來pid_t是一個int ,所以%d是正確的,但是如果在其他計算機上它具有不同的類型怎么辦? 你如何編寫一段代碼,在任何計算機上都能正常工作? 一種方法是選擇一個可能正確的類型,並使用該類型的說明符,然后使用顯轉換將您的值轉換為您選擇的類型。 像這樣:

printf("pid: %d\n", (int)pid);

或者像這樣:

printf("pid: %lu\n", (unsigned long int)pid);

如果不需要強制轉換(如果您選擇的格式說明符對於您計算機上的pid類型已經正確),則強制轉換不會受到傷害。

最后,恭喜您使用了實際上給您警告消息的編譯器:

警告:格式指定類型“無符號長”,但參數的類型為“pid_t”(又名“int”)

太多的初級程序員被困在使用不打印此類警告的舊編譯器,這顯然使得追蹤由不匹配的格式說明符引起的問題變得更加困難! (您的編譯器特別有用,因為它為您提供了pid的明顯類型,即pid_t ,以及實際的底層類型int 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM