1
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++;
4

6 回答 6

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);
}
于 2013-05-14T10:03:16.403 回答
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++);
于 2013-05-14T12:20:17.517 回答
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++ 在访问其原始竞争后增加指针。

于 2013-05-14T10:36:47.150 回答
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];

然后有区别

于 2013-05-14T10:03:34.797 回答
0

在 malloc 之后添加char *dest1 = dest;,然后返回 dest1 就可以了。

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

于 2013-05-14T10:07:44.500 回答
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;

}
于 2013-05-14T10:23:39.770 回答