我在c中得到了意想不到的输出。有人能解释为什么吗? #包括 int main() { INTA; printf(“%..geeksforgeks..%”); getchar(); 返回0; }

我在c中得到了意想不到的输出。有人能解释为什么吗? #包括 int main() { INTA; printf(“%..geeksforgeks..%”); getchar(); 返回0; },c,C,输出:%.0.geeksforgeks..% 有人能解释一下原因吗?在printf格式的字符串中,%用于表示转换的开始,例如整数的%d或浮点的%f 如果您试图打印出实际的百分号,请在格式字符串中使用%% 或者,如果要将其打印为文字字符串,请不要将其作为格式字符串提供: #include<stdio.h> int main() { int a; printf("%..geeksforgeeks..%"); getchar(); return 0; } 在printf格式字符串中,%

输出:
%.0.geeksforgeks..%


有人能解释一下原因吗?

在printf格式的字符串中,
%
用于表示转换的开始,例如整数的
%d
或浮点的
%f

如果您试图打印出实际的百分号,请在格式字符串中使用
%%

或者,如果要将其打印为文字字符串,请不要将其作为格式字符串提供:

#include<stdio.h>
int main()
{
int a;
printf("%..geeksforgeeks..%");

getchar();
return 0;
}

在printf格式字符串中,
%
用于表示转换的开始,例如整数的
%d
或浮点的
%f

如果您试图打印出实际的百分号,请在格式字符串中使用
%%

或者,如果要将其打印为文字字符串,请不要将其作为格式字符串提供:

#include<stdio.h>
int main()
{
int a;
printf("%..geeksforgeeks..%");

getchar();
return 0;
}

我不知道为什么会得到这个精确的输出,但问题是使用
%
作为元字符,因此如果要打印文字百分号,必须将其加倍

printf("%s", "%..geeksforgeeks..%");
或者,不要使用
printf
打印文字字符串:

printf("%%..geeksforgeeks..%%\n")

从技术上讲,在
printf
字符串中有比附加参数(要格式化的项)的数量更多的“活动”(未加倍)%符号会触发未定义的行为,这意味着C库可以做任何它想做的事情,从轻微的令人惊讶的行为,比如这样的行为,到并包括使整个计算机崩溃。

我不知道为什么会得到这个精确的输出,但问题是使用
%
作为元字符,所以如果要打印文字百分号,必须将其加倍

printf("%s", "%..geeksforgeeks..%");
或者,不要使用
printf
打印文字字符串:

printf("%%..geeksforgeeks..%%\n")

从技术上讲,在
printf
字符串中有比附加参数(要格式化的项)的数量更多的“活动”(未加倍)%符号会触发未定义的行为,这意味着C库可以做任何它想做的事情,从轻微的令人惊讶的行为,比如这样的行为,到甚至导致整个计算机崩溃。

%%
需要一个参数,使用
%%
打印百分号。请尝试
printf(“%%…geeksforgeks..%%”)为%。可能是某种printf标志?%。是一个精确标识符。可能与此有关。我最好的猜测是,
%..g
被视为
%g
,第一个浮点参数寄存器恰好包含零,但我不知道为什么在零上有一个前导的
%.
。我不想深入挖掘;过度研究未定义的行为可以告诉你关于C实现的有趣的事情,但在这里我认为它没有那么有用。
%%
需要一个参数,使用
%%
打印百分号。试试
printf(“%%…geeksforgeks….%%”)为%。可能是某种printf标志?%。是一个精确标识符。可能与此有关。我最好的猜测是,
%..g
被视为
%g
,第一个浮点参数寄存器恰好包含零,但我不知道为什么在零上有一个前导的
%.
。我不想深入挖掘;过度研究未定义的行为可以告诉你关于C实现的有趣的事情,但在这里我认为它并没有那么有用。