我有一个像这样声明的数组:
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,
答案 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
- 代价是更复杂的复制过程(并改善数据和数据访问时间的位置。)