printf()函数的type是%n时,不是表示打印数据,而是将打印信息的数量保存到指定的变量中,需要注意的是,在printf()函数中使用%n时,其对应的参数是变量的地址。
1 打开%n的开关
当printf()使用%n时,会有不安全的隐患,因此,默认情况下,%n是不能使用的。如果需要使用,则要打开%n的开关。
1.1 获取%n的开关状态
通过_get_printf_count_output()函数获取当前%n的开关状态。如果%n是不能使用,则返回值是0,否则返回值是1。
1.2 设置%n的开关状态
通过_set_printf_count_output()函数设置%n的开关状态。当该函数的参数是0时,则关闭%n的开关,如果参数是非零值,则打开%n的开关。_set_printf_count_output()函数的返回值是修改之前的%n的开关状态,不能使用,则返回值是0,否则返回值是1。
2 使用%n
以下代码在printf()中使用了%n
int a;
int e;
e = _get_printf_count_output();
if (e == 0)
{
_set_printf_count_output(1);
}
printf("12345%n", &a);
此时,a的值是%n之前的字符串的长度,即此时a的值是5。如果%n的位置变为
printf("123%n45", &a);
此时,a的值是%n之前的字符串的长度,即a的值是3。