如何将我的数组的字符串元素连接成C中的单个字符串?

时间:2014-09-10 14:19:00

标签: c arrays string concatenation string-concatenation

我有一个字符串数组,我想创建一个新字符串,它是所有数组元素的串联。感谢任何帮助,谢谢

3 个答案:

答案 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)

您的问题有两种可能的解释:

  1. 使用串联填充目标char数组,或
  2. 要(m)分配一个新的(足够大的)字符串,并用串联填充它

第二个问题显然可以简化为第一个问题:

 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;
}