正确使用 fprintf

Proper use of fprintf

这可以接受吗?

fprintf(fp,"Just a string");

fprintf(fp,stringvariable);

对比

fprintf(fp,"%s","Just a string");

我似乎很困惑,因为字符串变量(或常量)被用作格式而不是输出本身。如果字符串变量具有特定于格式的内容('%s' 等),那么输出将不是预期的。

对于仅字符串输出(无格式)哪个更好?

fprintf(fp,"%s",stringvariable);

fputs(stringvariable,fp);

如果您 "know" 字符串变量 "clean" 是可以接受的,前提是您不关心大多数现代编译器为该构造生成的警告。 因为:

  1. 如果您的字符串包含转换说明符 "by accident",您将调用未定义的行为。

  2. 如果您从某处读取该字符串,恶意攻击者可能会利用上面的第 1 点达到他的目的。

使用 puts()fputs() 通常更好,因为它们避免了这个问题,因此不会生成警告。 (puts() 也自动投掷 '\n'。)

*puts() 函数也有(稍微)更好的性能。 *printf(),即使只是 "%s" 作为格式字符串,仍然 必须解析该转换说明符,并计算其 [=46] 打印的字符数=]值。

感谢用户 'rici' 和 'Grady Player' 指出字符计数和编译器警告。我的 C 好像有点生锈了。 ;-)