C 将指针数组连接并添加到另一个指针数组的索引中

C 将指针数组连接并添加到另一个指针数组的索引中,c,C,是否可以将指针数组连接并添加到另一个指针数组的索引中。我试图将*标记指针中的字符串放入命令指针数组的第一个索引中,以此类推 cmd = strtok(str, " "); while(n < 5 && (act_token = strtok(NULL, " "))) { token[n] = act_token; n++;

是否可以将指针数组连接并添加到另一个指针数组的索引中。我试图将*标记指针中的字符串放入命令指针数组的第一个索引中,以此类推

            cmd = strtok(str, " ");
            while(n < 5 && (act_token = strtok(NULL, " ")))
            {
                    token[n] = act_token;
                    n++;
            }
            token[n] = NULL;


                    /* Below is where I'm trying to add all the elements of the token array into one index of the comands array */
                    while( z < len ){
                            comands[b] = token[z];
                            z++;
                    }
                    b++;
            } 
cmd=strtok(str,”);
而(n<5&(act_token=strtok(NULL,“”))
{
令牌[n]=行为令牌;
n++;
}
令牌[n]=NULL;
/*下面是我试图将令牌数组的所有元素添加到comands数组的一个索引中的地方*/
while(z
我感觉到了你的痛苦。字符串处理在C中非常糟糕,而且几乎和C++一样差。 然而,一旦你写了这个函数,你所要做的就是调用它

char *GetStringFromStringArray(const char**sourceStrings, size_t nCount)
{
  char *destString = NULL;
  size_t destLength = 1; //start with room for null-terminator
  if (nCount == 0)
    return destString;
  for (size_t i = 0; i < nCount; i++)
    destLength += strlen(sourceStrings[i]);
  destString = (char*)malloc(destLength);
  strcpy(destString, sourceStrings[0]);
  for (size_t i = 1; i < nCount; i++)
    strcat(destString, sourceStrings[i]);
  return destString;
}

int main()
{
  char *tokens[10] = { "bob", "jim", "hank" };
  char *destStrings[2];
  destStrings[0] = GetStringFromStringArray((const char**)tokens, 2);
  destStrings[1] = GetStringFromStringArray((const char**)&tokens[1], 2);
  free(destStrings[0]);
  free(destStrings[1]);
}
char*GetStringFromStringArray(常量字符**源字符串,大小\u t计数)
{
char*destString=NULL;
size\u t destLength=1;//从空终止符的空间开始
如果(nCount==0)
返回字符串;
对于(大小i=0;i
顺便说一句,我初始化
令牌的方式不正常。纯粹是为了简单的例子。

避免循环连接的O(n*n)复杂度,否则良好的答案,考虑复制到累积目的地的结束。

char *concat_alloc(const char *token[], size_t n) {
  size_t sum = 1;
  for (size_t i = 0; i < n; i++) {
    size_t len = strlen(token[i]);
    sum += len;
    if (sum < len) {
      return NULL;  // Too long
    }
  }

  char *dest = malloc(sum);
  if (dest) {
    char *p = dest;
    for (size_t i = 0; i < n; i++) {
      size_t len = strlen(token[i]);
      memcpy(p, token[i], len);
      p += len;  // advance to the end
    }
    *p = '\0';
  }
  return dest;
}
char*concat\u alloc(常量char*token[],大小\u t n){
大小总和=1;
对于(大小i=0;i
我对你的目标有点困惑。如果要有两个字符串,比如“JIM”和“BOB”,然后有另一个字符串,即“JIMBOB”,而不复制数据,那么你不能……嗯,至少不能不创建自己的字符串结构/函数。出了什么问题?什么不起作用?我可以看到未定义的行为。如果循环结束是因为
n>=5
那么
token[n]=NULL是UB。还有
int len=sizeof(令牌)/sizeof(令牌[0])
不会给出令牌的数量(你在
n
中已经有了,不是吗?@zzxyz我的目标是获取令牌[0]=“BOB”,令牌[1]=“John”,然后将其添加到comands指针中作为comand[0]=“BOB John”@John3136是的,我运行后意识到len不会给出令牌的数量。我已经有了N。我的代码一直工作到第二个while循环,在这个循环中我实现了类似这样的东西,例如令牌[0]=“BOB”,令牌[1]=“John”,然后添加到comands指针中作为comand[0]=“BOB”JOHN@pennyBoy-
command[0]=malloc(strlen(token[0])+strlen(token[1])+1);strcpy(command[0],token[0]);strcat(command[0],token[1] );
您可能应该为任意数量的令牌编写一个函数,但这是基本过程..谢谢。我会尝试一下,因为您肯定有一点(我应该使用
大小\u t
).尽管我会说,特别是考虑到OP对指针和字符串的舒适度,这可能是一种过早优化的情况。“过早优化”在试图使代码线性加速以使O()保持不变时很容易应用。这个答案不同。这需要学习者足够好的O(n*n)方法并将其带到O(n)。诚然,这可能超出了OP今天的范围,但不是过早的优化。是的,这很困难。我非常不喜欢在标准例程足够时不使用它们(这里是strcat),但我的回答会非常慢(非常慢)大量的字符串集合。我当然会用你的答案来表示字符串库,可能是我的答案来表示局部函数(处理已知数量)