【发布时间】:2014-11-04 05:53:17
【问题描述】:
我有一个字符串数组,我想创建一个新字符串,它是所有数组元素的串联。任何帮助表示赞赏,谢谢
【问题讨论】:
-
一个循环和
strcat函数?
标签: c arrays string concatenation string-concatenation
我有一个字符串数组,我想创建一个新字符串,它是所有数组元素的串联。任何帮助表示赞赏,谢谢
【问题讨论】:
strcat函数?
标签: c arrays string concatenation string-concatenation
您的问题有两种可能的解释:
第二个问题显然可以简化为第一个问题:
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;
}
【讨论】:
首先确定目标大小如果至少大于一个,则所有的大小
数组中的字符串放在一起,否则您最终将在
处写入字符串
一些您无法访问的随机内存地址,您最终可能会拥有
分段错误。
使用“strncat”比使用“strcat”更好,前者只能复制
预期的字节数。
在成功复制所有字符串后,不要忘记附加一个空终止符。
【讨论】:
#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;
}
【讨论】: