我尝试使用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
我不明白为什么以及如何将“ ”附加到字符串
答案 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缓冲区设为02 - ;每次都会增加作为char *的temp_str的值 这是什么意思?
这应该是正常的charachter指针,它将指向一些字符串,该字符串应该为空终止并且将被复制到str
3>通过梳理所有三个参数的总大小不应超过str缓冲区的大小
答案 3 :(得分:0)
你正在运行temp_str的结尾。检查你的边界并确保它被终止。停止增加太阳你到最后。