在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]
echar 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);