■问题:在要求用户输入文件保存的路径后,source中如果有类似sprintf(buff,
入力値)的处理时,一旦
入力値中包含”%”, 那么buff中的期望值就和实际值可能不一样。
例如用户输入这样的路径: C:\Temp%sfile
那么
sprintf(path, “C:\Temp%sfile”);
path期望值: C:\Temp%sfile
Path实际值: C:\Temp(null)file
如果去fopen这样的path,显然程序会出问题。
解决方法:在printf之前对%进行过滤,加上转义符“%”
■问题:在要求用户输入文件保存的路径后,source中如果有类似sprintf(buff,
入力値)的处理时,一旦
入力値中包含”%”, 那么buff中的期望值就和实际值可能不一样。
例如用户输入这样的路径: C:\Temp%sfile
那么
sprintf(path, “C:\Temp%sfile”);
path期望值: C:\Temp%sfile
Path实际值: C:\Temp(null)file
如果去fopen这样的path,显然程序会出问题。
解决方法:在printf之前对%进行过滤,加上转义符“%”
■关于%n的问题
void main()
{
int num1, num2;
printf(“12345
%n6789
%n\n”, &num1, &num2)
printf("First count %d Second count %d\n", num1 , num2);
}
vs2008下编译后运行抛出断言错误:
Expression: (“’n’ format specifier disabled”,0)
■%a,%b,%c……%z都不会出现这种错误,唯独%n
原来,printf族函数中,%n的作用是取得已经打印的字符串数目。
printf(“12345
%n6789
%n\n”, &num1, &num2)
当执行完上面代码时,结果应该是num1=5,num2=9
但是, 由于printf函数在使用%n存在安全问题,以前经常被黑客利用,所以VS2008在默认的情况下禁止这样使用。
如果一定要用到%n,那么可以在用之前加上这样一行代码:
_set_printf_count_output( int enable );
Enable的值为非0时,printf族函数里的%n解禁。