strcpy函数的一个版本,用于复制整数数组

时间:2014-08-02 19:14:19

标签: c arrays function pointers integer

我试图复制一个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()函数中完成的额外增量,输出仍然是相同的。

3 个答案:

答案 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)

您正在递增指针两次。这会带来错误的结果。

变量successi根本没有任何作用。

为了模仿strcpy()标准函数,您可以将限定符restrict添加到stringCopy()的每个参数中,这至少向编码人员建议参数不相交。

已更改: OP已将参数更改为类型int 但是,结束循环的条件(comparisson与0)现在似乎是任意的,因为整数数组不是以空值终止的。

此外,循环中指针的双增量仍然是错误的。

答案 2 :(得分:0)

按照惯例,解释为字符串的字符数组具有终止\0字符作为数组中的最后一个字符。因此,可以在不事先知道字符串长度的情况下编写字符串复制功能。一个int数组没有这样的特殊值,因此需要传入数组的大小并在循环测试条件中使用。