2014-03-04 19 views
2

我试图实现strcpy()标准函数,作为一个函数采取两个指针字符,并不返回任何内容。strcpy()实现..如何初始化函数本身的函数传递指针

我已经完成了正确的工作,但为了避免出现分段错误,我必须在将其分配给strcpy()函数之前初始化主函数中的“dest”指针。我试图在strcpy()函数本身做这个初始化,但不能因为我按值发送指针(字符地址),所以我不能在函数中改变它,尽管我可以改变它指针指向的不是点本身。

可能是将指针传递给指向strcpy()函数的指针的解决方案,但我希望它像标准函数一样工作,指向字符而不是指向指针的指针。

简而言之,如何通过初始化strcpy()函数中的指针而不是主函数来避免细分错误?

我希望我的问题是清楚的

这里是我的代码:

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

void myStrcpy(char *dest,const char *src){ 

    while(*src) 
    { 
     *dest = *src; 
     dest++; 
     src++; 
    } 
    *dest='\0'; 
} 

int main(void){ 

    char *src="Salahuddin"; 
    int len=strlen(src); 
    char *dest=(char*)malloc(len); 


    myStrcpy(dest,src); 


    printf("%s",dest); 

    return 0; 
} 
+2

你似乎试图执行'strdup',这是一个不同的接口。 –

+2

另外,'strcpy'具有不同的签名,它会返回'dest'字符串。这将有可能返回一个新分配的char []。 –

+0

'... =(char *)malloc(len)'应该是...... ... = malloc(len + 1)'。即不要强制返回(m/c)alloc(),并且您需要额外的字节作为空终止符。 – ryyker

回答

1

你不能在不改变API的签名。

-1

你可以声明你的功能

void myStrcpy(char *&dest,const char *src) 
        ^ look here! 

它会解决这个问题

可能是一个解决方案,通过一个指针指向的strcpy() 功能,但我想它像标准功能一样,取指向字符的指针不是指向指针的指针。

+0

我不知道这个语法:'char *&dest'是什么意思? – Macattack

+4

这是C++而不是C,你可以这样做:'void myStrcpy(char ** dest,const char * src)'。 –

3

间接仅仅是单向的。除非您将地址传入或返回值,否则不能更改指针。

+0

那么实际的标准库strcpy()如何工作? – Salahuddin

+2

@Salahuddin'strcpy()'希望接收一个指向'dest'的指针来分配内存,然后它可以在不需要进一步mallocing的情况下写入内存。 – Macattack

+1

@Salahuddin标准的strcpy()函数非常像你的函数(尽管它也返回'dest'指针)。标准的strcpy()不初始化dest指针,如果你还没有初始化dest指针,它可能会像你自己的函数一样崩溃。 (有一个错误,'(char *)malloc(len);'应该是'(char *)malloc(len + 1);' – nos

-1

为什么你不能这样做?

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

void myStrcpy(char *dest, const char *src) 
{ 
    if (dest == NULL) { 
     dest = (char *) malloc(strlen(src)); 
    } 

    while(*src) { 
     *dest = *src; 
     dest++; 
     src++; 
    } 
    *dest='\0'; 
} 

int main(void) 
{ 
    char *src="Salahuddin"; 
    int len=strlen(src); 
    char *dest=NULL; 

    myStrcpy(dest, src); 

    printf("%s", dest); 

    return 0; 
} 

您也可以使用calloc函数而不是malloc,它会自动初始化分配的内存“\ 0”。

当然,你必须小心,并确保你释放你的记忆在任何情况下......但你应该能够分配的功能在内存。

+0

不要强制转换'malloc'的返回值:https:// stackoverflow。 com/questions/605845/do-i-cast-the-result-of-malloc –

+0

我试过这样做,但是不行,你不能在myStrcpy()中改变或改变dest,如果你这样做了,你只需更改它的一个副本,而不是指针本身,因为它是按值传递的。换句话说,在myStrcpy中,可以更改指针'dest'指向的内容,而不是指针本身 – Salahuddin

+2

'printf(“%s” ,dest);'使用'dest'或'NULL'的原始值,而不是'myStrcpy()'中分配的值' – chux

-1

有感于此只:我想实现的strcpy()标准函数,作为一个函数接受两个指向字符和返回什么。

如果第一句话是什么,你真的想的精确表示,
然后写一个包装各地strcpy()

int main(void) 
{ 
    char *dest; 
    char src[] = {"some string"); 
    dest = calloc(sizeof(src), sizeof(char)); 
    myStrcpy(dest, src); 
    //use dest 
    free(dest); 
    return 0; 
} 

void myStrcpy(char *dest, char *src) 
{ 
    strcpy(dest, src); 
} 

这是光秃秃的骨头,但也有一些错误检查,它会做你在你的介绍句子中描述的。

+0

男人,你在开玩笑吗,在这段代码中,我试图写我自己的strcpy()函数 – Salahuddin

+0

不,我不是在开玩笑。它的唯一建议是基于你的***第一个和最显着的***短语(它有参数,它什么也不返回)。围绕标准库函数的包装经常是经常出现的,而且经常是出于很好的理由。如果你不能使用它,那么不要。另外,我建议你编辑你的答案,不要模糊这种事情。 – ryyker

+0

我认为问题的标题是strcpy的实现,它可以任何方式 – Salahuddin