正确使用 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" 是可以接受的,前提是您不关心大多数现代编译器为该构造生成的警告。 因为:
如果您的字符串包含转换说明符 "by accident",您将调用未定义的行为。
如果您从某处读取该字符串,恶意攻击者可能会利用上面的第 1 点达到他的目的。
使用 puts()
或 fputs()
通常更好,因为它们避免了这个问题,因此不会生成警告。 (puts()
也自动投掷 '\n'
。)
*puts()
函数也有(稍微)更好的性能。 *printf()
,即使只是 "%s"
作为格式字符串,仍然 必须解析该转换说明符,并计算其 [=46] 打印的字符数=]值。
感谢用户 'rici' 和 'Grady Player' 指出字符计数和编译器警告。我的 C 好像有点生锈了。 ;-)
这可以接受吗?
fprintf(fp,"Just a string");
或
fprintf(fp,stringvariable);
对比
fprintf(fp,"%s","Just a string");
我似乎很困惑,因为字符串变量(或常量)被用作格式而不是输出本身。如果字符串变量具有特定于格式的内容('%s' 等),那么输出将不是预期的。
对于仅字符串输出(无格式)哪个更好?
fprintf(fp,"%s",stringvariable);
或
fputs(stringvariable,fp);
如果您 "know" 字符串变量 "clean" 是可以接受的,前提是您不关心大多数现代编译器为该构造生成的警告。 因为:
如果您的字符串包含转换说明符 "by accident",您将调用未定义的行为。
如果您从某处读取该字符串,恶意攻击者可能会利用上面的第 1 点达到他的目的。
使用 puts()
或 fputs()
通常更好,因为它们避免了这个问题,因此不会生成警告。 (puts()
也自动投掷 '\n'
。)
*puts()
函数也有(稍微)更好的性能。 *printf()
,即使只是 "%s"
作为格式字符串,仍然 必须解析该转换说明符,并计算其 [=46] 打印的字符数=]值。
感谢用户 'rici' 和 'Grady Player' 指出字符计数和编译器警告。我的 C 好像有点生锈了。 ;-)