我有一个字符串数组,我想创建一个新字符串,它是所有数组元素的串联。感谢任何帮助,谢谢
答案 0 :(得分:3)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *concatenate(size_t size, char *array[size], const char *joint){
size_t jlen, lens[size];
size_t i, total_size = (size-1) * (jlen=strlen(joint)) + 1;
char *result, *p;
for(i=0;i<size;++i){
total_size += (lens[i]=strlen(array[i]));
}
p = result = malloc(total_size);
for(i=0;i<size;++i){
memcpy(p, array[i], lens[i]);
p += lens[i];
if(i<size-1){
memcpy(p, joint, jlen);
p += jlen;
}
}
*p = '\0';
return result;
}
int main(){
char *ss[] = { "first", "second", "last" };
char *cat = concatenate(3, ss, "");
puts(cat);
free(cat);
cat = concatenate(3, ss, ", ");
puts(cat);
free(cat);
return 0;
}
答案 1 :(得分:1)
首先要确保目的地大小至少超过一个,大小全部为
数组中的字符串合在一起,否则你最终会将字符串写在
一些随机内存地址,你无法访问,你最终可能会有
分段错误
最好使用&#34; strncat&#34;比&#34; strcat&#34;,前者将使你只能复制
预期的字节数。
在成功复制所有字符串后,不要忘记附加空终止符。
答案 2 :(得分:1)
您的问题有两种可能的解释:
第二个问题显然可以简化为第一个问题:
char *concatenation_of(char *strings[], size_t number) {
size_t sum;
for (size_t i = 0; i < number; i++) {
sum += strlen(strings[i]);
}
return strcatarray(malloc(sum + 1), strings, number);
}
因此,我们现在集中讨论将字符串数组连接到目标区域的情况。
天真的版本,使用strcat
:
char *strcatarray(char * dest, char *strings[], size_t number)
{
dest[0] = '\0';
for (size_t i = 0; i < number; i++) {
strcat(dest, strings[i]);
}
return dest;
}
尽管简单,但这有一个主要缺点:目标字符串越来越大,并且花费越来越多的时间来查找将下一个strings[i]
附加到何处。这也是二次算法。
一个小而简单的解决方法是保留终止空字符的地址,并在其后附加:
char *strcatarray(char * dest, char *strings[], size_t number) {
char *target = dest; // where to copy the next elements
*target = '\0';
for (size_t i = 0; i < number; i++) {
strcat(target, strings[i]);
target += strlen(strings[i]); // move to the end
};
return dest;
}
最后,如果您想用胶水“连接”字符串元素:
char *strjoinarray(char * dest, char *strings[], size_t number, char * glue) {
size_t glue_length = strlen(glue);
char *target = dest; // where to copy the next elements
*target = '\0';
for (size_t i = 0; i < number; i++) {
if (i > 0) { // need glue
strcat(target, glue);
target += glue_length;
}
strcat(target, strings[i]);
target += strlen(strings[i]); // move to the end
};
return dest;
}