SocialButterfly 发表于 2025-10-5 03:01

禁止sprintf在目标末尾写入终止空字符


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 = '\0';// 确保缓冲区安全(可选)
      return -1;// 截断错误
    }
   
    // 手动去除\0(若需要)
    buffer = ' ';// 或其他操作
    return len;
}

// 使用示例
char buf;
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

添加程序进行放错设置
页: [1] 2
查看完整版本: 禁止sprintf在目标末尾写入终止空字符