簡體   English   中英

為什么以下代碼給出此輸出?

[英]Why the following code gives this output?

我正在調整printf()函數。由於printf()函數采用格式說明符,以便識別要打印的數據類型(如果我錯了,請糾正我)作為參數傳遞給它的數據類型的值,所以我試圖做這樣的事情

#include<stdio.h>
int main()
{
char *f="%d";
char *g="asd";

printf(f,g);
return 0;
}

而o / p是-

4210739

我不明白為什么o / p是數字?

因為,您的代碼調用了undefined behavior

您正在嘗試使用%d格式說明符打印字符串 您應該改用%s格式說明符。 為特定格式(轉換)說明符使用錯誤的參數類型將調用UB。

引用C11 ,第§7.21.6.1章

[...]如果任何參數不是對應轉換規范的正確類型,則行為未定義。

更改

char *f="%d";

char *f="%s";

如前所述, %d說明符指定您將傳遞一個整數作為第二個參數,並傳遞一個指針( *char類型)變量。 因此, printf()例程將指針解釋為整數,並按此方式打印指針(實際上是它的值)。

要正確輸出字符串,您應該使用%s說明符。

你說,

由於printf()函數采用格式說明符以便識別要打印的數據類型(如果我輸入錯誤,請更正我)

我不確定,但是我認為您在這里可能有點不對。

你打電話時

printf(f, g);

要理解的關鍵是, printf無法知道g的類型

調用printf您的工作是確保對於在格式字符串中使用的每個格式說明符(即每個% thingie),傳遞正確類型的參數。 對於格式字符串中的每個%d ,必須傳遞一個int 對於格式字符串中的每個%f ,必須傳遞double 對於格式字符串中的每個%s ,必須傳遞一個char *指向有效字符串。 等等。

在您的代碼中,格式字符串中有%d ,但是您沒有傳遞int ,而是傳遞了char *指向字符串。 因此,您無法獲得預期的結果。

%d想要一個int ,但是您沒有給它一個。 您傳遞了一個char * ,但是printf不知道該如何處理。 (如果您使用了%s ,則printf將知道如何處理char * 。)

暫無
暫無

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

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