我正在调整printf()
函数。因为printf()
函数采用格式说明符来识别要打印的数据类型(纠正我,如果我错了)的值数据类型作为参数传递给它,所以我试着做这样的事情---
#include<stdio.h>
int main()
{
char *f="%d";
char *g="asd";
printf(f,g);
return 0;
}
而o / p是 -
4210739
我无法理解为什么o / p是一个数字?
答案 0 :(得分:10)
因为,您的代码会调用undefined behavior。
您正在尝试使用%d
格式说明符打印字符串。您应该使用%s
格式说明符。对特定格式(转换)说明符使用错误类型的参数调用UB。
引用C11
,章节§7.21.6.1
[...]如果有任何论据 不是相应转换规范的正确类型,行为是 未定义。
更改
char *f="%d";
到
char *f="%s";
答案 1 :(得分:5)
如前所述,%d
说明符指定您将传递一个整数作为第二个参数,而是传递指针(*char
类型)变量。因此printf()
例程将指针解释为整数并将其打印(实际上是它的值)。
要正确输出字符串,您应该使用%s
说明符。
答案 2 :(得分:0)
你说,
因为printf()函数采用格式说明符来识别要打印的数据类型(如果我错了就纠正我)
我不确定,但我认为你在这里可能有点不对。
致电时
printf(f, g);
要理解的关键是 printf
无法知道g
的类型。
当你致电printf
时,你的工作是为了确保你在格式字符串中使用的每个格式说明符(即每%
个东西),你传递正确类型的参数。对于格式字符串中的每个%d
,您必须传递int
。对于格式字符串中的每个%f
,您必须传递double
。对于格式字符串中的每个%s
,您必须传递指向有效字符串的char *
。等等。
在您的代码中,格式字符串中有%d
,但您传递int
指向字符串,而不是传递char *
。所以你没有得到你期望的结果。
%d
想要一个int
,但你没有给它一个。您通过了char *
,但printf
不知道如何处理它。 (如果您使用过%s
,则printf
会知道如何处理char *
。)