C语言中“format string is not a string literal (potentially insecure)”警告求解
问题解释与解决办法
警告含义
你收到的「format string is not a string literal (potentially insecure)」警告,核心原因是不该把用户输入的变量直接当作fprintf的格式字符串。
fprintf的第二个参数设计为固定格式的字面量(比如"%s"),如果传入用户可控的内容(比如你代码里的fcontents),一旦用户输入包含%d、%s这类格式占位符,程序会错误地从内存中读取额外数据,轻则崩溃,重则被利用引发安全问题,所以编译器会抛出这个警告提示风险。
解决办法
有两种简单可靠的修复方式:
方式1:用fputs替代fprintf
fputs的作用就是直接输出字符串到文件,不需要格式解析,完美匹配你的需求:
// 替换原来的 fprintf(fpointer, fcontents); fputs(fcontents, fpointer);
方式2:规范使用fprintf的格式字符串
如果坚持用fprintf,把格式字符串写成固定的字面量"%s",再把fcontents作为参数传入:
// 替换原来的 fprintf(fpointer, fcontents); fprintf(fpointer, "%s", fcontents);
额外提示
你的代码里还有两个小问题可以优化:
scanf("%s")会在遇到空格、换行时停止读取,用户输入带空格的内容会被截断,建议改用fgets读取输入;fname和fcontents的数组长度是20,要注意用户输入过长会导致缓冲区溢出,最好在scanf里限制长度,比如scanf("%19s", fname)(留1个位置存字符串结束符\0)。
内容的提问来源于stack exchange,提问作者user18326065
相关产品推荐
相关产品推荐

