【问题标题】:How do I concatenate the string elements of my array into a single string in C?如何在 C 中将数组的字符串元素连接成单个字符串?
【发布时间】:2014-11-04 05:53:17
【问题描述】:

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

【问题讨论】:

  • 一个循环和strcat函数?

标签: c arrays string concatenation string-concatenation


【解决方案1】:

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

  1. 用串联填充目标字符数组,或
  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;
}

【讨论】:

    【解决方案2】:

    首先确定目标大小如果至少大于一个,则所有的大小
    数组中的字符串放在一起,否则您最终将在
    处写入字符串 一些您无法访问的随机内存地址,您最终可能会拥有
    分段错误。
    使用“strncat”比使用“strcat”更好,前者只能复制
    预期的字节数。 在成功复制所有字符串后,不要忘记附加一个空终止符。

    【讨论】:

      【解决方案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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-25
        • 1970-01-01
        • 2020-04-02
        • 2023-04-02
        • 1970-01-01
        • 2014-04-19
        相关资源
        最近更新 更多