C Sprintf()附加垃圾字符

时间:2011-10-26 07:20:56

标签: c printf

我尝试使用sprintf追加int,string和int。

sprintf(str,"%d:%s:%d",count-1,temp_str,start_id);

这里,start_id的值始终相同。每次都会增加作为char *的temp_str的值。我得到正确的输出一段时间然后我的sprintf开始在temp_str和startid之间打印垃圾字符。所以我的str被破坏了。

任何人都可以解释这种行为吗?

例如

在第11位

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

在第8位

8:1:2:3:1:2:3:1:2:3:1:21:3:1:2:3:1:2:3:1:2:3:1:2 :3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3 :1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1 :2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2

我不明白为什么以及如何将“ ”附加到字符串

4 个答案:

答案 0 :(得分:4)

temp_str在某些时候都不会以空值终止,或者你为str烧掉了缓冲区,而其他一些内存访问正在影响它。

在没有看到代码的情况下,它有点难以辨别,但是,如果你将str的大小加倍并且问题行为发生变化,那么它可能就是后者。

答案 1 :(得分:0)

字符串temp_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);

答案 2 :(得分:0)

1>尝试使用sprintf

将你的str缓冲区设为0

2 - ;每次都会增加作为char *的temp_str的值 这是什么意思?

这应该是正常的charachter指针,它将指向一些字符串,该字符串应该为空终止并且将被复制到str

3>通过梳理所有三个参数的总大小不应超过str缓冲区的大小

答案 3 :(得分:0)

你正在运行temp_str的结尾。检查你的边界并确保它被终止。停止增加太阳你到最后。