禁止sprintf在目标末尾写入终止空字符
sprintf函数在类型转换的末尾会自动写入终止空字符。但是在应用中不需要这个字符。
有没有办法可以防止sprintf在目标末尾写入终止空字符。
sprintf的设计约束 放弃 sprintf C标准库函数 依赖 \0标识字符串结束。若手动去除 \0,需确保后续逻辑不调用这些函数,否则可能导致越界或错误。 为什么不能直接禁止 sprintf 加 \0? 无法通过格式字符串或参数禁用此行为 用 snprintf + 手动截断 memcpy加格式化 自定义格式化函数,实现一个不添加 '\0' 的格式化函数 用sprintf 后截断 C标准库没有提供直接禁用 sprintf 终止符的接口。 snprintf 或第三方库 保留\0是更安全、规范的做法。 #include <stdarg.h>
#include <string.h>
// 自定义无终止符的格式化函数
int my_sprintf_no_null(char *buffer, size_t size, const char *fmt, ...) {
va_list args;
va_start(args, fmt);
int len = vsnprintf(buffer, size, fmt, args);// 使用vsnprintf限制长度
va_end(args);
// 若len >= size,说明被截断,最后一个字符是\0(需处理)
if (len >= (int)size) {
buffer = '\0';// 确保缓冲区安全(可选)
return -1;// 截断错误
}
// 手动去除\0(若需要)
buffer = ' ';// 或其他操作
return len;
}
// 使用示例
char buf;
my_sprintf_no_null(buf, sizeof(buf), "%d", 12345);// buf内容为"12345"(无\0) 封装一个不添加\0的格式化函数 C语言字符串的约定决定的——所有以\0结尾的字符序列才能被视为有效字符串 C语言中的字符串约定以空字符结尾。 无法禁用空字符 自定义“无终止符”的格式化函数 添加程序进行放错设置
		页: 
[1] 
2