警告:格式不是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) (注意颠倒的参数)。