我在C中有一个字符串:"电话/错误。即信用卡pmnt"。它的长度是30个字符。我想在这个" R *"前面添加一个字符串。所以我的最终输出为" R * Phone / mis。即信用卡p"。 字符串在结尾处截断,因为其最大长度为30个字符。 我试过下面的代码,其中iov_pPymArr-> pymInfoArray [i] .type_desc变量包含字符串" Phone / mis。即信用卡pmnt":
sprintf (iov_pPymArr->pymInfoArray[i].type_desc,"R*%s",iov_pPymArr->pymInfoArray[i].type_desc);
But it gives me output as : "R*R*e/mis. ie Credit Card pmnt".
R *被追加两次,字符串从开头而不是结尾被截断。请告知可能的解决方案。
答案 0 :(得分:5)
使用sprintf
向自身写入缓冲区是未定义的行为。
使用sprintf
(甚至更好,snprintf
)写入另一个临时缓冲区,并将其复制到实际缓冲区。
答案 1 :(得分:2)
您无法就地使用sprintf
。您的问题的解决方案是使用临时缓冲区。
答案 2 :(得分:1)
如果你想绝对地减少你的内存使用量并且你的字符串缓冲区足够大,你可以使用memmove
在它前面留出空间(从空终止符后面的空格,除非需要在那里,除非你想要一个段错误,然后将前缀memcpy到前面,而没有终止零。
#define STR " Phone/mis. ie Credit Card p"
#define PREFIX "R*"
#include <stdio.h>
#include <string.h>
int main(){
char buff[sizeof(STR) + 2] = STR;
memmove(buff + 2, buff, sizeof(buff) - 2);
memcpy(buff, PREFIX, 2);
puts(buff);
}
<强>输出:强>
R* Phone/mis. ie Credit Card p
注意:Appending in the front
被称为prepending
。
答案 3 :(得分:0)
使用sprintf将缓冲区写入自身是未定义的,而不是合法的编码方式。请改用strcat或临时缓冲区。