1

这是可以接受的吗?

fprintf(fp,"Just a string");

或者

fprintf(fp,stringvariable);

相对

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

由于字符串变量(或常量)被用作格式而不是输出本身,这似乎让我感到困惑。如果字符串变量具有特定于格式的内容('%s' 等),则输出将不符合预期。

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

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

或者

fputs(stringvariable,fp);
4

1 回答 1

2

如果您“知道”字符串变量是“干净的”,如果您不关心大多数现代编译器为该构造生成的警告,这是可以接受的。因为

  1. 如果您的字符串“意外”包含转换说明符,则您正在调用未定义的行为。

  2. 如果您从某个地方读取该字符串,恶意攻击者可以利用上述第 1 点达到他的目的。

通常最好使用puts()fputs()避免此问题,因此不会产生警告。(puts()也扔在自动'\n'。)

这些*puts()功能还具有(略微)更好的性能。*printf(),即使只是"%s"作为格式字符串,仍然必须解析该转换说明符,并计算为其返回值打印的字符数。

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

于 2015-11-12T15:31:38.743 回答