strcpy使用指针

我正在尝试使用指针自己编写strcpy,我在运行时遇到错误。

void str_cpy(char **destination, const char *source) { // char *s1 = *destination; while (*source != '\0') { **destination++ = *source++; //Get an error here } **destination = '\0'; } 

我把这个函数调用如下:

 char *str = NULL; str_cpy(&str, "String"); 

不行吗?

谢谢!

不,这不好。 为什么? 因为str是一个NULL指针。 它没有指向任何东西。 当你尝试将值写入其中时,它们会去哪里? 它没有指向任何已分配的内存!

首先必须为str分配内存。 你可以做:

 char *str = malloc(strlen("String") + 1); // + 1 for the '\0' character at the end of C-style strings 

或者你可以这样做:

 char str[256]; // make str large enough to hold 256 chars. Note that this is not as safe as the above version! 

此外, destination应该是单个指针,而不是双指针。 嗯,使用双指针在技术上并不是错误的,这是不必要的。

或者,您可以在str_cpy函数中分配内存,如下所示:

 void str_cpy(char **destination, const char *source) { *destination = malloc(strlen(source) + 1); // ... continue as normal 

为简单起见,这可以在函数中的一行中完成。

 void mystrcpy(char *dest, const char *src) { while (*dest++ = *src++); } 

这就是说,你需要事先使用mallocdest分配内存,或者只是简单地使用像char dest[256]这样的字符数组char dest[256]

我没有看到任何需要传递指针指针:

 void str_cpy(char *dst, const char *src) { while (*src != '\0') { *dst++ = *src++; } *dst = '\0'; } 

并且你需要在传递之前为dst分配内存:

 const char *src = "String"; char *str = malloc(strlen(src)+1); //plus one for null byte str_cpy(dst, src); 

您可能应该为该指针分配一些内存,然后再将其传递给一个填充指向的函数(在本例中为NULL)。

例:

 char *str = malloc(128); if (str) { str_cpy(&str, "String"); free(str); str = NULL; } 

我建议不要在没有提供目标缓冲区大小信息的情况下这样做(即如果你自己编写,然后边界检查目标缓冲区,否则你的版本与strcpy()有相同的安全漏洞,因为它很糟糕)。

注意:除非您计划更改作为目标传递的指针所持有的地址,否则您也不需要使用双指针。 您使用的双指针使用会阻止传统的strcpy()使用模式:

 char str[128]; str_cpy(&str, "Hello"); // error. 

数组地址不能作为指向指针传递,因此如果没有中间指针,代码就无法填充静态数组:

 char str[128]; char *p = str; str_cpy(&p, "Hello"); //ok. passing address of pointer. 

如果这不是故意的(我不明白为什么它可能是除非你有想法在内部模拟strdup()在NULL指针通道上)你应该解决这个问题。

这是一个完整的实现。 好文章来自这里。 描述时间和性能。 我虽然没有衡量自己。 http://www.howstuffworks.com/c35.htm

 char* mystrcpy(char *dst, const char *src) { char *ptr = dst; while ((*dst++ = *src++) ) ; return ptr; } int main(int argc, char *argv[]) { const char *src = "This is C.\0"; char *dst = malloc(sizeof(char)*(strlen(src)+1)); //+1 for the null character dst = mystrcpy(dst, src); printf("%s",dst); return 1; } 

最近我遇到了上面一个使用double pointer strcpy implementation

它可能对代码下的其他人有帮助

  void strcpy_i( char **dst, const char *src ) { *dst=(char *)malloc((strlen(src)+1)*sizeof(char)); char *tmp=*dst; if(tmp == NULL || src == NULL) return ; while((*tmp++=*src++)!='\0'); } int main() { char v[]="Vinay Hunachyal"; char *d=NULL; strcpy_i(&d,v); printf("%s",d); return 0; 

}

 #include void main() { void mystrcpy(char *,char *); char s1[100],s2[100]; char *p1; char *p2; p1=s1; p2=s2; printf("Enter the string to copy to s2...?\n"); scanf("%s",p1); mystrcpy(p2,p1); printf("S2 after copying = %s",p2); } void mystrcpy(char *p2,char *p1) { while(*p1!='\0') { *p2=*p1; p2++; p1++; } *p2='\0'; } 

它是我的解决方案.. 简单易懂 ..