【发布时间】:2010-05-10 15:48:39
【问题描述】:
在遇到%c 格式给定值\0/NULL 时,采用 printf 格式字符串的各种函数将如何表现?
他们应该如何表现?安全吗?定义了吗?它是特定于编译器的吗?
例如sprintf() - 它会在 NULL 处裁剪结果字符串吗?它会返回多长?
printf() 会输出整个格式字符串还是只输出新的 NULL?
va_args + vsprintf/vprintf 会受到某种影响吗?如果有,怎么做?
我是否会冒内存泄漏或其他问题的风险?在 std::string.c_str() 中的某个点拍摄这个 NULL?
避免这种警告的最佳方法是什么(清理输入?)
【问题讨论】:
-
宏 NULL 和字符 '\0' 不是一回事。后者通常用 ASCII 助记符 NUL 表示,但这也与 NULL 不同。
-
@Clifford:过去存在 NULL 不为零的系统,但现在除非你正在编写一些早已过时的大型铁恐龙,否则你没有遇到这个警告的风险。跨度>
-
我想你没抓住我的意思 -
NULL是一个代表空 指针 的宏,而\0是一个字符常量(在 C 和char在 C++ 中)。此外,不管空指针的实际机器相关位模式如何,C++ 保证零可以隐式转换为这样的指针。我的观点是,在这种情况下,您可以引用 nul、空字符、NUL 或\0,但不应使用宏NULL来表示这样的字符。将单词放在code mark-up中可能意味着NULL 宏。
标签: c++ c string format printf