C strcpy字符串指针数组

时间:2017-11-24 16:48:41

标签: c c-strings strcpy

我有一个像这样声明的数组:

char *array[4];

由不同的字符串函数填充,即[“one”,“two”,“three”,“four”]。

我的目标是将此数组复制到一个新数组中,不包括最后两个元素,因此new_array将包含[“one”,“two”]。

这是我到目前为止所尝试的:

int *new_array[2];

for (int i = 0; i < 2; i++){
    strncpy(new_array[i], array[i], strlen(array[i]));
}

但是收到了以下警告:

warning: passing argument 1 of ‘strncpy’ from incompatible pointer type [-Wincompatible-pointer-types]

note: expected ‘char * restrict’ but argument is of type ‘int *’

extern char * strncpy(char * __ restrict __dest,

3 个答案:

答案 0 :(得分:3)

您的代码存在一些问题

首先它声明了一个整数指针数组(因此警告),然后这些指针没有被初始化。 strncpy不是正确的调用函数(即使内存已初始化,它也不会终止你的字符串),你需要strdup进行正确的分配和放大;副本:

char *new_array[2];

for (int i = 0; i < 2; i++){
    new_array[i] = strdup(array[i]);
}

(在某些旧系统上,strdup可能无法使用。如果您遇到这种情况,请使用new_array[i] = malloc(strlen(array[i]+1));然后strcpy(new_array[i],array[i]);

两种方法都分配动态内存,不再使用时需要free

但是如果你只是想存储指针,例如因为array包含文字并且你不打算修改你的字符串,你可以只复制指针:

new_array[i] = array[i];

答案 1 :(得分:1)

来源和目的地不兼容 char * array [4]; int * new_array [2];

我希望你错误地输入int?

答案 2 :(得分:0)

除了Jean-FrançoisFabre给出的精彩答案之外,我还要指出,即使已知的大小也会随着程序的发展而变化,因此使用已知的终结符(即NULL或NaN)结束列表很有用。 )。

我认为你刚刚开始使用C语言,但这是一个很好的习惯(习惯于将所有内容都设置为瞬态并最小化代码中的前概念)。

尽管人们指出strdup不是标准C,但它可以广泛使用。我会避免它只是为了踢。我希望你注意到错误检查(过多?可能......但真正的代码应该用这些东西填充)。

请考虑以下代码(但不要使用它,可能会稍微破坏):

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

char **string_array_dup(char *const *ary) {
  int count = 0;
  char **copy;
  if (!ary)
    return NULL;
  /* count string items - this is unsafe */
  while (ary[count++])
    ;
  if (!count)
      return NULL;
  /* allocate memory for array and set terminator. */
  copy = malloc(sizeof(*copy) * (count + 1));
  if (!copy)
    perror("ERROR"), exit(errno);
  copy[count - 1] = NULL;
  /* itterate over array, allocate and copy strings. */
  count = 0;
  while (ary[count]) {
    int register len = (int)strlen(ary[count]);
    copy[count] = malloc(len + 1); /* remember NUL byte */
    if (!ary[count])
      perror("ERROR"), exit(errno);
    memcpy(copy[count], ary[count], len + 1); /* copy NUL byte */
    count += 1;
  }
  return copy;
}

void string_array_print(char **ary) {
  int count = 0;
  while (ary[count]) {
    printf("%s ", ary[count++]);
  }
  printf("\n");
}

void string_array_free(char **ary) {
  int count = 0;
  /* free each string */
  while (ary[count]) {
    free(ary[count++]);
  }
  /* free container */
  free(ary);
}

int main(void) {
  char *array[] = {
      "String", "array", "is", "always", "terminated", "with", NULL,
  };
  char **copy = string_array_dup(array);
  if (!copy)
    perror("ERROR"), exit(errno);
  string_array_print(copy);
  string_array_free(copy);
  return 0;
}

顺便说一句,此代码可以优化为只使用一个malloc(或使用realloc)和一个free - 代价是更复杂的复制过程(并改善数据和数据访问时间的位置。)