[其他ST产品] 禁止sprintf在目标末尾写入终止空字符

[复制链接]
1396|37
SocialButterfly 发表于 2025-10-5 03:01 | 显示全部楼层 |阅读模式

sprintf函数在类型转换的末尾会自动写入终止空字符。但是在应用中不需要这个字符。
有没有办法可以防止sprintf在目标末尾写入终止空字符。
10299823 发表于 2025-10-10 10:09 | 显示全部楼层
sprintf的设计约束​              
adolphcocker 发表于 2025-10-10 10:50 | 显示全部楼层
放弃 sprintf              
jonas222 发表于 2025-10-10 11:00 | 显示全部楼层
C标准库函数 依赖 \0标识字符串结束。若手动去除 \0,需确保后续逻辑不调用这些函数,否则可能导致越界或错误。
jkl21 发表于 2025-10-10 11:45 | 显示全部楼层
为什么不能直接禁止 sprintf 加 \0?
chenci2013 发表于 2025-10-10 12:25 | 显示全部楼层
无法通过格式字符串或参数禁用此行为
classroom 发表于 2025-10-10 14:57 | 显示全部楼层
用 snprintf + 手动截断
cr315 发表于 2025-10-10 15:57 | 显示全部楼层
memcpy加格式化
duo点 发表于 2025-10-10 15:58 | 显示全部楼层
自定义格式化函数,实现一个不添加 '\0' 的格式化函数
elephant00 发表于 2025-10-10 14:59 | 显示全部楼层
用sprintf 后截断
flycamelaaa 发表于 2025-10-10 17:59 | 显示全部楼层
C标准库没有提供直接禁用 sprintf 终止符的接口。
jcky001 发表于 2025-10-10 19:21 | 显示全部楼层
snprintf 或第三方库
ingramward 发表于 2025-10-11 11:54 | 显示全部楼层
保留\0是更安全、规范的做法。              
ulystronglll 发表于 2025-10-11 16:11 | 显示全部楼层
#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[size-1] = '\0';  // 确保缓冲区安全(可选)
        return -1;  // 截断错误
    }
   
    // 手动去除\0(若需要)
    buffer[len] = ' ';  // 或其他操作
    return len;
}

// 使用示例
char buf[10];
my_sprintf_no_null(buf, sizeof(buf), "%d", 12345);  // buf内容为"12345"(无\0)
yeates333 发表于 2025-10-11 17:55 | 显示全部楼层
封装一个不添加\0的格式化函数              
mollylawrence 发表于 2025-10-11 19:42 | 显示全部楼层
C语言字符串的约定决定的——所有以\0结尾的字符序列才能被视为有效字符串
wilhelmina2 发表于 2025-10-11 21:04 | 显示全部楼层
C语言中的字符串约定以空字符结尾。
macpherson 发表于 2025-10-12 12:50 | 显示全部楼层
无法禁用空字符              
lihuami 发表于 2025-10-12 13:27 | 显示全部楼层
自定义“无终止符”的格式化函数​
jf101 发表于 2025-10-12 22:07 | 显示全部楼层
添加程序进行放错设置
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

62

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部