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++;
答案 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;
}