警告:格式不是string文字和格式参数
我想删除我在代码的这一行上得到的警告,
FILE *fil; char *imp; (...) fprintf(fil,imp);
事情是当我这样做它写在文件正是我想要的,但如果我应用格式%s它不这样做
fprintf(fil, "%s", imp);
这个警告是gcc告诉你的,它不能validationprintf样式函数的格式string参数(printf,fprintf …等)。 如果编译器无法手动查看string并确保在运行时按照您的意图进行操作,则会生成此警告。 让我们看几个例子。
情况1.这个string可以在编译时被validation,编译器会允许它没有警告:
printf("This string has no format");
情况2:对于这种情况,编译器可以检测到你有一个格式说明符,并会引发不同的警告。 在我的机器上,它说“警告:格式太less的参数”。
// This will most probably crash your machine printf("Not a safe string to %s");
案例3.现在这是你的情况。 您正在运行时生成一个string并尝试打印它。 你得到的警告是编译器警告你在string中可能有一个格式说明符。 说例如“坏%sdata”。 在这种情况下,运行时将尝试访问不存在的参数以匹配%s。 更糟的是,这可能是一个试图利用你的程序的用户(导致它读取不安全的数据)。
char str[200]; scanf("%s", str) printf(str)
虽然在技术上用一个string调用一个类似printf的函数没有什么问题,但是这样做仍然是一个坏习惯,因为string可能包含像%s
这样的格式标记。 如果imp
是%s test
例如,坏事将发生。
如果你只是想打印没有格式化的imp
,你应该使用fputs(imp, fil)
(注意颠倒的参数)。