在C语言中将一个字符串复制到另一个字符串

在C语言中将一个字符串复制到另一个字符串,c,C,我想将源字符串复制到目标字符串。 上面的api返回null。 如果我使用字符数组(我已经评论过了),那么这个api对我有效 请帮助我理解两者的区别 char *stringcopywithpointer( const char *source) { int ii = 0; int len = strlen(source) +1; char *dest = (char*)malloc(sizeof(char)*len); while(*source != '\0')

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

请帮助我理解两者的区别

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;
}


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

*dest++ = *source++;
注意,您可以使用

如果您可以访问非标准的


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

*dest++ = *source++;
注意,您可以使用

如果您可以访问非标准的

(一)

应该是

printf("\n copied string = %s", dest1);
这可能是个打字错误

(二)

您可以更改:

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

(三)

关于
dest[ii++]=*source++
*dest++=*source++之间的差异

如果以这种方式定义
dest
,则没有区别,应该可以工作

while(*dest++ = *source++);
如果您的数组是以这种方式定义的:

char *dest = (char*)malloc(sizeof(char)*len);
那么就有区别了

1)

应该是

printf("\n copied string = %s", dest1);
这可能是个打字错误

(二)

您可以更改:

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

(三)

关于
dest[ii++]=*source++
*dest++=*source++之间的差异

如果以这种方式定义
dest
,则没有区别,应该可以工作

while(*dest++ = *source++);
如果您的数组是以这种方式定义的:

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

然后有差异

Add
char*dest1=dest在malloc之后,然后返回dest1,这样就可以了


其他可能的更改:将while循环替换为post-condition循环(即,首先复制零字节,然后检查是否为结尾)。

Add
char*dest1=dest在malloc之后,然后返回dest1,这样就可以了


其他可能的更改:将while循环替换为post-condition循环(即先复制零字节,然后检查是否为结尾)。

可能需要添加此行

char dest[len];

可能您需要添加这一行

char dest[len];

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

<>你应该考虑把分配的内存传递到你的函数中去复制它。 如果出现任何错误,可以使用返回值返回错误

这会将您的签名更改为

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;

}
为了使代码更具版本性,您可以实现VARG,您的签名如下:

int stringcopywithpointer( char * dest, const char *source)
这实际上是已经存在的函数sprintf

int stringcopywithpointerf( char * dest, const * format, ... );
该功能也有安全的变体可用和预制。你可能想考虑使用其中的一个。

如果这与家庭作业有关,请查看此函数:

int sprintf( char * dest, const * format, ... );
你可能想把错误检查添加到它中,就像你在原来的帖子中把它们放在适当的位置一样(malloc等)


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

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

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

<>你应该考虑把分配的内存传递到你的函数中去复制它。 如果出现任何错误,可以使用返回值返回错误

这会将您的签名更改为

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;

}
为了使代码更具版本性,您可以实现VARG,您的签名如下:

int stringcopywithpointer( char * dest, const char *source)
这实际上是已经存在的函数sprintf

int stringcopywithpointerf( char * dest, const * format, ... );
该功能也有安全的变体可用和预制。你可能想考虑使用其中的一个。

如果这与家庭作业有关,请查看此函数:

int sprintf( char * dest, const * format, ... );
你可能想把错误检查添加到它中,就像你在原来的帖子中把它们放在适当的位置一样(malloc等)


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

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

我的意见:

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

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;
}
无论机器如何,
sizeof(char)
始终为1字节。更少的冗余是
sizeof(char)*len
。最佳选择是
malloc(sizeof(source))

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

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

我的意见是:

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

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;
}
无论机器如何,
sizeof(char)
始终为1字节。更少的冗余是
sizeof(char)*len
。最佳选择是
malloc(sizeof(source))

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

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


他在代码中所做的,分配的内存是
int len=strlen(source)+1;因此空字符被计数
@MOHAMED Yep,谢谢,我只注意到当我添加函数的更新版本时。也许
return dest len+1
是他的解决方案proble@MOHAMED这会起作用,但它不是最清晰的代码,而且似乎容易出现bug。他在代码中所做的,分配的内存是
int len=strlen(来源)+1;因此空字符被计数
@MOHAMED Yep,谢谢,我只注意到当我添加函数的更新版本时。可能
return dest len+1
是他的解决方案proble@MOHAMED这会起作用,但它不是最清晰的代码,而且似乎容易出现bug。这并不重要,因为他在while循环whic中执行
dest++
h将使
dest
指向最后一个字符。这并不重要,因为他正在while循环中执行
dest++
,这将使
dest
指向最后一个字符。我意识到