如何在C中的字符串前面附加一个字符串

时间:2015-09-29 11:02:02

标签: c string printf c-strings

我在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 *被追加两次,字符串从开头而不是结尾被截断。请告知可能的解决方案。

4 个答案:

答案 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或临时缓冲区。