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

时间:2013-05-14 10:01:41

标签: 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++;

6 个答案:

答案 0 :(得分:8)

您在dest循环期间递增while。你需要保持一个指向缓冲区起点的指针,以便从函数返回。

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

答案 1 :(得分:2)

我的意见:

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

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++);

答案 2 :(得分:1)

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以这种方式定义

,则应该有效
char *dest = (char*)malloc(sizeof(char)*len);

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

char dest[len];

然后有差异

答案 3 :(得分:1)

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

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

这会将您的签名更改为。

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

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

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

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

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

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

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

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

您可能希望在原始帖子中将错误检查添加到其中(malloc等)。


“请帮助我理解dest [i ++]和* dest ++”

之间的区别

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

答案 4 :(得分:0)

在malloc之后立即添加char *dest1 = dest;,然后返回dest1,这将有效。

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

答案 5 :(得分:0)

可能需要添加此行

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;

}