C Sprintf()追加垃圾字符

C Sprintf()追加垃圾字符,c,printf,C,Printf,我尝试使用sprintf附加一个int、string和一个int sprintf(str,"%d:%s:%d",count-1,temp_str,start_id); 这里,start_id的值始终相同。temp_str是char*的值每次都会增加。我获得了一段时间的正确输出,然后我的sprintf开始在temp_str和startid之间打印垃圾字符。所以我的str被破坏了 有人能解释这种行为吗 范例 第11点 11:1:2:3:1:1:2:3:1:21:3:1:2:3:1:2:3:1:1:

我尝试使用sprintf附加一个int、string和一个int

sprintf(str,"%d:%s:%d",count-1,temp_str,start_id);
这里,start_id的值始终相同。temp_str是char*的值每次都会增加。我获得了一段时间的正确输出,然后我的sprintf开始在temp_str和startid之间打印垃圾字符。所以我的str被破坏了

有人能解释这种行为吗

范例

第11点

11:1:2:3:1:1:2:3:1:21:3:1:2:3:1:2:3:1:1:2:3:1:1:2:2:3:1:3:1:3:1:3:1:3:1:2:1:2:1:3:2:3:3:3:1:3:1:2:2:2:3:2:3:1:2:3:3:3:1

数到8

8:1:2:3:1:2:3:1:2:3:1:21:3:1:2:3:2:3:1:1:2:3:1:1:2:2:2:1:1:3:3:1:3:1:3:1:2:1:2:2:2:3:3:3:3:1:3:1:2:2:2:3:2:3:1:3:2:3:1:3:3:1�:二,


我不明白为什么和如何“�" 被追加到字符串

或者
temp_str
在某个点不是空终止的,或者您已经为
str
清空了缓冲区,并且其他一些内存访问正在影响它


如果没有看到代码,就有点难说了,但是如果将
str
的大小增加了一倍,并且问题行为发生了变化,那么可能是后者。

看起来字符串
temp\u str
没有NUL终止。您可以在调用
sprintf
之前终止它,或者如果您知道所需的长度要打印,请使用如下所示的
%.*s
格式化运算符:

int str_len = ...;     // Calculate length of temp_str
sprintf(str, "%d:%.*s:%d", count-1, str_len, temp_str, start_id);

1> 在使用sprintf之前,尝试将str缓冲区设置为0

2> temp_str是char*的值每次都会增加 你这是什么意思

这应该是一个普通的字符指针,它将指向某个字符串,该字符串应该以null结尾,并将其复制到str


3> 通过组合所有三个参数得到的总大小不应超过str buffer的大小

您正在运行temp_str的末尾。检查您的边界并确保它以null结尾。在到达末尾时停止递增。

发布所有变量和一些代码的定义。可能
str
不高h够了。至少99%的时候你在使用sprintf,你实际上应该使用snprintf。只要确保你不使用
strlen计算
temp\u str
:-)