如何在C中的字符串前面附加一个字符串
How to append a string in front of string in C
我在 C 中有一个字符串:"Phone/mis. ie Credit Card pmnt"。它的长度是 30 个字符。我想在这个 "R*" 前面附加一个字符串。所以我的最终输出是 "R* Phone/mis. ie Credit Card p"。
字符串在此处截断,因为它的最大长度为 30 个字符。
我试过下面的代码,其中 iov_pPymArr->pymInfoArray[i].type_desc 变量包含字符串 "Phone/mis. ie Credit Card 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* 被附加了两次,字符串从开头而不是结尾被截断。请告知可能的解决方案。
使用 sprintf
将缓冲区写入自身是 未定义的行为。
使用sprintf
(或者更好,snprintf
)写入另一个临时缓冲区,并将其复制到实际缓冲区。
您不能就地使用 sprintf
。您的问题的解决方案是使用临时缓冲区。
如果你想绝对减少你的内存使用量并且你的字符串缓冲区足够大,你可以使用 memmove
在它的前面制作 space (来自 space过去需要存在的空终止符,除非你想要一个段错误)然后 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
。
使用 sprintf 将缓冲区写入自身是未定义的,并且不是合法的编码方式。请改用 strcat 或临时缓冲区。
我在 C 中有一个字符串:"Phone/mis. ie Credit Card pmnt"。它的长度是 30 个字符。我想在这个 "R*" 前面附加一个字符串。所以我的最终输出是 "R* Phone/mis. ie Credit Card p"。 字符串在此处截断,因为它的最大长度为 30 个字符。 我试过下面的代码,其中 iov_pPymArr->pymInfoArray[i].type_desc 变量包含字符串 "Phone/mis. ie Credit Card 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* 被附加了两次,字符串从开头而不是结尾被截断。请告知可能的解决方案。
使用 sprintf
将缓冲区写入自身是 未定义的行为。
使用sprintf
(或者更好,snprintf
)写入另一个临时缓冲区,并将其复制到实际缓冲区。
您不能就地使用 sprintf
。您的问题的解决方案是使用临时缓冲区。
如果你想绝对减少你的内存使用量并且你的字符串缓冲区足够大,你可以使用 memmove
在它的前面制作 space (来自 space过去需要存在的空终止符,除非你想要一个段错误)然后 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
。
使用 sprintf 将缓冲区写入自身是未定义的,并且不是合法的编码方式。请改用 strcat 或临时缓冲区。