如何在c中聚合字符串数组

时间:2015-01-20 03:19:55

标签: c arrays string

这是一个数组:

char *a[]={"I", "LOVE", "C", "PROGRAMMING"};

如何将此数组聚合为c?

中的字符串

即,

char b[]="I LOVE C PROGRAMMING";

我曾尝试为每个字符串使用memcpy,但我不知道彼此添加空格。

int width[4];
for(int i=0; i<4; i++)
    width[i]=strlen(a[i]);

//aggregate the msg length
int agg_len[4];
int len_w = 0
for (no = 0; no < 4; no++) {
    len_w += width[no];
    agg_len[no] = len_w;
}
//compose msg
memcpy(b, a[0], width[0]);
for(idx = 1; idx < 4; idx++)
{
    memcpy(b+agg_len[idx], a[idx], width[idx]);
}

结果是&#34; ILOVECPROGRAMMING&#34;

如何修复它&#34;我喜欢C编程&#34;

我尝试添加空格,但在使用memcpy

时失败但内存地址错误

因为它需要在每个步骤后添加1个长度(&#34;&#34;需要1个长度)

3 个答案:

答案 0 :(得分:1)

一种解决方案是找到数组中的字符串数(num),并使新数组的长度为num-1,这样当你编写消息时,只需在完成复制每个单词后添加空格即可。

答案 1 :(得分:1)

制作足够的缓冲区并使用strcat。应该放置空间,除了最后一个。

#include <stdio.h>
#include <string.h>

int
main(int argc, char* argv[]) {
  char *a[]={"I", "LOVE", "C", "PROGRAMMING"}; 
  char buf[1024] = {0};
  int i, len = sizeof(a)/sizeof(a[0]);
  for (i = 0; i < len; i++) {
    strcat(buf, a[i]);
    if (i < len - 1)
      strcat(buf, " ");
  }
  printf("[%s]\n", buf);
  return 0;
}

可能你想要的是sizeof(a)/sizeof(a[0])

如果您必须使用**a代替*a[]

#include <stdio.h>
#include <string.h>

int
main(int argc, char* argv[]) {
  char *a[] = {"I", "LOVE", "C", "PROGRAMMING", NULL}; 
  char buf[1024] = {0}, **p = a;
  while (*p) {
    strcat(buf, *p);
    if (*p && *(p + 1))
      strcat(buf, " ");
    p++;
  }
  printf("[%s]\n", buf);
  return 0;
}

答案 2 :(得分:0)

#include <stdio.h>
#include <string.h>

int main(void){
    char *a[]={"I", "LOVE", "C", "PROGRAMMING"};
    size_t a_size = 4;
    size_t width[a_size], total_size = 0;

    for(int i=0; i<a_size; i++){
        total_size += (width[i] = strlen(a[i]));
    }
    char b[total_size + a_size];//between ' '(a_size-1) + NUL(1)
    char *p = b;
    for(int i=0; i<a_size; ++i){
        if(i)
            *p++ = ' ';//put space
        memcpy(p, a[i], width[i]);
        p += width[i];
    }
    *p = '\0';//put NUL
    printf("'%s'\n", b);
    return 0;
}