[英]Does C add '\0' when you pass a literal string as an argument in a function?
[英]Pass string literal as the argument to the print function with out any format specifier?
為什么即使我沒有傳遞任何格式說明符而是傳遞字符串文字,我也沒有收到錯誤。 字符串文字的情況下沒有錯誤,但字符的情況下有錯誤,integer。 為什么?
#include<stdio.h>
int main()
{
printf("Hello World");
return 0;
}
printf
的第一個參數應該是格式字符串1 。 "Hello World"
是格式字符串2 。
根據 C 2018 標准中的第 7.21.6.1 3 段,格式字符串由零個或多個指令組成:
%
字符開始一個轉換規范的指令。 所以"Hello World"
是一個格式字符串,表示打印“H”、“e”、“l”、“l”、“o”、“”、“W”、“o”、“r”、“l ”和“d”。 它只是一個只有普通字符的格式字符串,沒有轉換規范。 它是printf
的第一個參數的正確類型和數據,因此不會出現錯誤。
相反,當char
或int
作為第一個參數傳遞給printf
時,編譯器知道它是錯誤的參數類型並發出警告或錯誤消息。
1從技術上講,參數應該是指向格式字符串第一個字符的指針。
2 "Hello World"
作為指針傳遞,因為雖然它是一個字符數組,但它會自動轉換為指向其第一個字符的指針。
printf上的文檔如下:
int printf ( const char * format, ... );
將格式化數據打印到 stdout 將 format 指向的 C 字符串寫入標准 output (stdout)。 如果 format 包含格式說明符(以 % 開頭的子序列),則格式后面的附加 arguments 將被格式化並插入到結果字符串中,替換它們各自的說明符。 將 char 或 int 變量代替上面的格式將失敗
在 C11 到 select 中引入的預處理器和通用選擇的幫助下,可以根據參數類型生成正確的格式字符串。
嘗試:
#define FMT(X) _Generic(X, int: "%d", char*: "%s", float: "%f")
#define print(X) printf(FMT(X), (X))
現在程序:
int main() {
print(1);
print("abc");
print(3.0f);
return 0;
}
產生預期的 output 為1abc3.00000
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.