在strcat中添加空间

在strcat中添加空间,c,string,strcat,C,String,Strcat,我有两个字符串char str1[41]echar str2[41]。如果我使用strcat函数来连接它们,我会得到一个没有空格的唯一字符串,而这些字符串之间会有空格 这可能是一种方式: strcat(strcat(str1, " "),str2) 它是否以另一种方式存在?sprintf(目标,“%s%s”、str1、str2) 你必须提供一个目的地。您可以使用str1作为目标,它可能会正常工作,但请注意,您当前的操作方式可能会导致超出str1s缓冲区 asprintf()将为您分配一个长度正

我有两个字符串
char str1[41]
e
char str2[41]
。如果我使用
strcat
函数来连接它们,我会得到一个没有空格的唯一字符串,而这些字符串之间会有空格

这可能是一种方式:

strcat(strcat(str1, " "),str2)
它是否以另一种方式存在?

sprintf(目标,“%s%s”、str1、str2)

你必须提供一个目的地。您可以使用
str1
作为目标,它可能会正常工作,但请注意,您当前的操作方式可能会导致超出
str1
s缓冲区


asprintf()
将为您分配一个长度正确(读取:安全)的缓冲区,但您必须记住在使用完该缓冲区后
释放该缓冲区。

如果需要strcat,我相信最有效的方法是:

size_t length = strlen(str1);
str1[length] = ' '; // overwrite null termination
str1[length+1] = '\0'; // add a new null termination
strcat(str1, str2);

当然,还要注意缓冲区溢出。

在与str2连接之前,在str1的末尾添加一个空格,或者在str2的开头添加一个空格,然后连接两个字符串…

以保持效率并尊重
str1
的有限数组大小

size_t Len1 = strlen(str1);
size_t Len2 = strlen(str2);
if ((Len1 + 1 + Len2) >= sizeof(str1)) {
  ; // handle error
}
str1[Len1] = ' ';
memcpy(&Str1[Len1+1], str2, Len2 + 1);

如C11 K.3.7.1.3中所定义,如果可用,请使用
strcpy_s()



前提:
strcat()
不是必需的。

您可以试试这个。我希望它能帮助你

strcat(string1, " ");
strcat(string1, string2);

在空间周围放置花括号可以解决此问题:
strcat(str,{'})

甚至更有效(如果不需要
strcat()
):
strcpy(str1+length+1,str2)
而不是
str1[length+1]='\0'
strcat(str1,str2)@IngoLeonhardt是,添加了澄清。如果不需要strcat,则
memcpy(str1+strlen(str1)、str2、strlen(str2)+1)
会更有效率。@Lundin我不认为memcpy会更有效率,因为需要确定strlen(str2)。这将导致您遍历该字符串两次,而一个简单的strcat只遍历该字符串一次,在NULL处停止。@mah strcat将检查每个字符是否为NULL并复制它,因此它执行的指令量大约是memcpy的两倍。理论上,memcpy+strlen加在一起的指令量应该与strcat相当。我想哪一个速度最快并不明显,这取决于memcpy的优化程度、缓存等。
asprintf()
非常好,但请注意,它不是POSIX标准,因此并非随处都可用,因为它似乎是一个源代码形式的自由许可版本。我自己没有使用过这个实现。第一件事就是strcat(strcat(str1,“”),str2)所做的事情
strcat(string1, " ");
strcat(string1, string2);