我试图复制一个strcopy()函数来处理ANSI-C中的整数数组,以便熟悉函数。 这是我写的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int array[10] = {0,2,3,4,5,6,7,8,9,10};
int * pointer1;
int * pointer2 = malloc(10 * sizeof(int));
int i;
//assign first pointer
pointer1 = array;
//print pointer1
printf("Pointer1's array : \n");
for(i=0;i<10;i++)
{
printf("%d ",*(pointer1+i));
}
printf("\n");
//copy pointer1 to pointer2
intCopy(pointer1,pointer2);
//print pointer2's array
printf("Pointer2's array: \n");
for(i=0;i<10;i++)
{
printf("%d ",*(pointer2+i));
}
printf("\n");
free(pointer2);
return 0;
}
//copy an integer array
int intCopy(int * input, int * output)
{
//copy input to ouput element by element
while((*output++=*input++) != '\0')
{
//copy each element until null terminator is found;
output++;
input++;
}
return 0;
}
代码假设使指针2表现得像指针1,但带有新的数组副本
但是,当我尝试打印指针2应该指向的整数时,我得到了这个: -
Pointer2的数组:
0 0 0 0 0 0 0 0 0 0
我直接从教科书中复制了strcopy的代码,并且不知道如何只有第一个 元素已成功复制。我很感激帮助。
编辑:我已经删除了在intCopy()函数中完成的额外增量,输出仍然是相同的。
答案 0 :(得分:2)
2个问题:
1)增量指针两次,只需要一次,如@ pablo1977指出
while((*output++=*input++) != '\0') {
// output++; // delete these 2 lines
// input++;
}
2)要复制的数组的第一个元素为0.这在intCopy()
int array[10] = {0,2,3,4,5,6,7,8,9,10};
// --------------^
C中的字符串是char
的数组,最多包含一个终止'\0'
。模仿&#34; int&#34;使用int
数组时,int
数组也需要以0
终止。 OP提供的阵列第一个元素是0
,因此只复制第一个元素0
。由于OP还打印了9个额外的&#34; 0&#34;,后来的9个值恰好是0
,因为这是UB。
OP需要传递给intCopy()
元素的数量(然后数组不需要以0
终止并且可能包含0
个元素。)或者确保源数组有一个终止0
(在这种情况下,第一个0
也是最后一个元素)。 OP做了第二个,但是终止0
也是第一个元素。
与任何此类复制一样,编码也确保了目的地的足够大小。
答案 1 :(得分:0)
您正在递增指针两次。这会带来错误的结果。
变量success
和i
根本没有任何作用。
为了模仿strcpy()
标准函数,您可以将限定符restrict
添加到stringCopy()
的每个参数中,这至少向编码人员建议参数不相交。
已更改: OP已将参数更改为类型int
但是,结束循环的条件(comparisson与0)现在似乎是任意的,因为整数数组不是以空值终止的。
此外,循环中指针的双增量仍然是错误的。
答案 2 :(得分:0)
按照惯例,解释为字符串的字符数组具有终止\0
字符作为数组中的最后一个字符。因此,可以在不事先知道字符串长度的情况下编写字符串复制功能。一个int数组没有这样的特殊值,因此需要传入数组的大小并在循环测试条件中使用。