将字符串复制到C中的另一个字符串

char *stringcopywithpointer( const char *source) { int ii = 0; int len = strlen(source) +1; char *dest = (char*)malloc(sizeof(char)*len); while(*source != '\0') { // dest[ii++] = *source++; *dest++ = *source++; } // dest[ii] = '\0'; *dest = '\0'; printf("\n copied string = %s", dest1); return dest; } 

我想将源字符串复制到目标字符串。 上面的api返回null。 如果我使用数组(我已经评论过),那么这个api对我有用。

请帮我理解两者之间的区别

 dest[ii++] = *source++ 

 *dest++ = *source++; 

你在while循环期间递增dest 。 您需要保持指向缓冲区开头的指针以从函数返回。

 char *stringcopywithpointer( const char *source) { int ii = 0; int len = strlen(source); char *copy = malloc(len+1); char* dest = copy; while(*source != '\0') { *dest++ = *source++; } *dest = '\0'; printf("\n copied string = %s", copy); return copy; } 

请注意,您可以使用strcpy保存一些代码

 char *stringcopywithpointer( const char *source) { int len = strlen(source); char *copy = malloc(len+1); strcpy(copy, source); return copy; } 

如果您可以访问非标准的strdup ,可以将其减少到一行

 char *stringcopywithpointer( const char *source) { return strdup(source); } 

我的看法:

避免在被调用函数中分配内存,在调用函数之前更好地分配内存

 char *dest = ( char* ) malloc( sizeof( char ) * len ); // doesn't looks great 

无论机器如何, sizeof( char )始终为1个字节。 较少冗余的是sizeof( char ) * len 。 最佳将是malloc( sizeof( source ) )

指针和数组是相关的你可以使用

 dest[i] = src[i]; *dst++ = *src++; 

要么

 // assuming dst memory allocate by caller while ( *dst++ = *src++); 

1)

 printf("\n copied string = %s", dest1); 

应该

 printf("\n copied string = %s", dest); 

这可能是一个错字

2)

你可以改变:

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

通过

 while(*dest++ = *source++); 

3)

关于dest[ii++] = *source++*dest++ = *source++;之间的区别*dest++ = *source++;

如果以这种方式定义dest则没有区别并且应该有效

 char *dest = (char*)malloc(sizeof(char)*len); 

如果您的数组以这种方式定义:

 char dest[len]; 

然后有区别

您不应该返回已分配的字符串。 这很容易导致内存泄漏。

相反,你应该考虑将分配的内存传递给你的函数来复制它。 如果出现任何问题,您可以使用返回值返回错误。

这会将您的签名更改为。

 int stringcopywithpointer( char * dest, const char *source) 

为了让您的代码更加通用,您可以实现vargs,您的签名将是:

 int stringcopywithpointerf( char * dest, const * format, ... ); 

这实际上是已经存在的函数sprintf。

 int sprintf( char * dest, const * format, ... ); 

还有可用和预制function的安全变体。 您可能需要考虑使用其中之一。

如果这是相关的功课,请看看这个function:

 char * myscpy(const char * SRC){ size_t size = strlen( SRC ) + 1 ; char * START; char * DST = ( char * ) malloc( size ); START = DST; do { *DST = *SRC; DST++; SRC++; }while( *SRC != 0 ); *DST = *SRC; return START; } 

您可能希望像在原始post中使用它们(malloc等)一样添加错误检查。


“请帮助我理解dest [i ++]和* dest ++之间的区别”

dest [i ++]不会增加指针,而是增加指针的索引。 * dest ++在访问其原始contendt后递增指针。

添加char *dest1 = dest; 在malloc之后,然后返回dest1,这将工作。

其他可能的更改:使用后置条件循环替换while循环(即先复制零字节,然后检查它是否为结束)。

可能你需要添加这一行

 char *stringcopywithpointer( const char *source) { int ii = 0; int len = strlen(source) +1; char *ptr = NULL; char *dest = (char*)malloc(sizeof(char)*len); /** No Error Checking for malloc is a strict no no **/ if(dest == NULL) return NULL; /** hold the dest adress in ptr as we are incrementing dest **/ ptr = dest; while(*source != '\0') { // dest[ii++] = *source++; *dest++ = *source++; } // dest[ii] = '\0'; *dest = '\0'; //printf("\n copied string = %s", dest1); ?? printf("\n copied string = %s", ptr); // ptr will have our copied String /** so return ptr not dest **/ return ptr; }