Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C printf():何时写入%n?_C_Printf_String Formatting - Fatal编程技术网

C printf():何时写入%n?

C printf():何时写入%n?,c,printf,string-formatting,C,Printf,String Formatting,考虑以下代码: #include <stdio.h> int main() { int i = 0; printf("hello%n%d\n", &i, i); } #包括 int main(){ int i=0; printf(“你好%n%d\n”、&i、i); } 为什么它打印的是hello0,而不是hello5?%n未写入。它的意思是“没有印刷。” : 换句话说,printf返回后,i将包含值5。但直到printf返回——这就是为什么您看到的是0而不是5。

考虑以下代码:

#include <stdio.h>

int main() {
  int i = 0;
  printf("hello%n%d\n", &i, i);
}
#包括
int main(){
int i=0;
printf(“你好%n%d\n”、&i、i);
}

为什么它打印的是
hello0
,而不是
hello5

%n未写入。它的意思是“没有印刷。”

:


换句话说,printf返回后,
i
将包含值5。但直到printf返回——这就是为什么您看到的是0而不是5。

调用函数时,函数参数会复制到被调用函数的范围中。由于
i
0
,因此值
0
被复制到
printf
的范围内,并用于在
%d
转换中打印

此外,值
&i
被复制到函数的作用域中,函数使用该值用迄今为止的输出字节数填充该地址处的变量。因此,在函数调用返回后,可以检查
i
以找到该值


您使用相同的变量为
%d
参数生成值,并为
%n
参数生成地址,这完全是巧合。事实上,最后一个
i
参数确实有点误导,因为这里重要的不是
i
的身份,而是它的值。您还可以在那里放置一个文本
0
。(从技术上讲,表达式
i
进行“左值转换”,这只是一种花哨的说法,表示您不关心变量,只关心值。)

为什么它应该打印5??您的整数值是0,这就是您所指的printf中的InsideArgument将从右向左执行。也基于编译器。好的,%n说明符应该将到目前为止写入的字节数写入整数i,因此我应该包含值5(因为“hello”包含5个字符)。对于任何考虑过函数、参数传递和引用语义的人来说,这个问题可能是显而易见的,但对于一个从未经历过这种情况的人来说,这似乎是一个完全合理的问题。啊,该死,我错过了。谢谢因此,当printf解析格式字符串时,会立即写入%n?@delta242:否,或者类似。如果“立即”是指“在解析过程中”。一旦到达输出字符串的那一部分,它就会被写入。在您的情况下,它应该写5左右的值。您可以稍后通过打印原始
i
进行检查。字符串不是经过“解析”的,而是经过“处理”的,它是一个简单的从左到右的单过程。是的,我知道,之后变量I包含值5。我只需要在解析格式字符串时写入的“功能”。@delta242:您的意思是要在相同的printf调用中打印运行计数吗?我不确定这是否可能。。。您需要另一个解引用转换说明符,我认为没有。(虽然可能有供应商扩展。)我需要它来利用格式字符串,这是大学的一门课程。
I
printf
将5写入其传递的地址时将包含5,而该地址在
printf
返回之前,因此这不是打印“0”而不是“5”的原因。打印“0”的原因是,0是在准备调用
printf
时计算参数
i
的结果。
Nothing printed.
The corresponding argument must be a pointer to a signed int.
The number of characters written so far is stored in the pointed location.