为什么下面的代码会给出这个输出?
Why the following code gives this output?
我正在调整 printf()
function.Since 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
[...] If any argument is
not the correct type for the corresponding conversion specification, the behavior is
undefined.
改变
char *f="%d";
至
char *f="%s";
如前所述,%d
说明符指定您将传递一个整数作为第二个参数,而是传递一个指针(*char
类型)变量。所以 printf()
例程将指针解释为整数并打印它(实际上是值)。
要正确输出字符串,您应该使用%s
说明符。
你说,
Since the printf() function takes a format specifier in order to recognize the datatype to print (Correct me if i'm wrong)
我不确定,但我认为你在这里可能有点不对。
当你打电话时
printf(f, g);
要理解的关键是 printf
无法知道 g
.
的类型
当您调用 printf
时,您的 工作是确保您在格式字符串,您传递了正确类型的参数。对于格式字符串中的每个 %d
,您必须传递一个 int
。对于格式字符串中的每个 %f
,您必须传递一个 double
。对于格式字符串中的每个 %s
,您必须传递指向有效字符串的 char *
。等等。
在您的代码中,格式字符串中有一个 %d
,但您没有传递 int
,而是传递了指向字符串的 char *
。所以你没有得到你期望的结果。
%d
想要一个 int
,但你没有给它。您传递了 char *
,但 printf
不知道如何处理它。 (如果您使用了 %s
,那么 printf
就会知道如何使用 char *
。)
我正在调整 printf()
function.Since 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
[...] If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.
改变
char *f="%d";
至
char *f="%s";
如前所述,%d
说明符指定您将传递一个整数作为第二个参数,而是传递一个指针(*char
类型)变量。所以 printf()
例程将指针解释为整数并打印它(实际上是值)。
要正确输出字符串,您应该使用%s
说明符。
你说,
Since the printf() function takes a format specifier in order to recognize the datatype to print (Correct me if i'm wrong)
我不确定,但我认为你在这里可能有点不对。
当你打电话时
printf(f, g);
要理解的关键是 printf
无法知道 g
.
当您调用 printf
时,您的 工作是确保您在格式字符串,您传递了正确类型的参数。对于格式字符串中的每个 %d
,您必须传递一个 int
。对于格式字符串中的每个 %f
,您必须传递一个 double
。对于格式字符串中的每个 %s
,您必须传递指向有效字符串的 char *
。等等。
在您的代码中,格式字符串中有一个 %d
,但您没有传递 int
,而是传递了指向字符串的 char *
。所以你没有得到你期望的结果。
%d
想要一个 int
,但你没有给它。您传递了 char *
,但 printf
不知道如何处理它。 (如果您使用了 %s
,那么 printf
就会知道如何使用 char *
。)