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("
copied string = %s", dest1);
return dest;
}
我想将源字符串复制到目标字符串。
上面的api返回null。
如果我使用字符数组(我已对此发表评论),那么此api对我有效。
请帮助我了解两者之间的区别
dest[ii++] = *source++
和
*dest++ = *source++;
我意识到这是次要的事情,但是函数名称stringcopywithpointer()以str开头,因此它在为实现保留的空间中。 该函数应重命名。
您的评论对我来说不是次要的,我没有意识到。 也许更挑剔:以str开头的名称仅在第四个字母为小写时才保留(stringcopywithpointer的情况)。
您正在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("
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);
}
他在代码中所做的事情,分配的内存为int len = strlen(source) +1; so the null char is counted
@MOHAMED是的,谢谢,我只是在添加功能的更新版本时才注意到。
也许return dest-len+1是他问题的解决方案
@MOHAMED可以,但是它不是最清晰的代码,似乎容易出现错误。
我的想法:
避免在调用函数中分配内存,最好在调用函数之前分配内存
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++);
您不应返回分配的字符串。这很容易导致内存泄漏。
相反,您应该考虑将分配的内存传递到函数中以进行复制。
如果发生任何错误,您可以使用返回值返回错误。
这会将您的签名更改为。
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 ++在访问其原始竞争对象后将其递增。
1)
printf("
copied string = %s", dest1);
应该
printf("
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];
然后有区别
这与他在while循环中执行dest++无关紧要,这会使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("
copied string = %s", dest1); ??
printf("
copied string = %s", ptr); // ptr will have our copied String
/** so return ptr not dest **/
return ptr;
}
在malloc之后添加char *dest1 = dest;,然后返回dest1,它将起作用。
其他可能的更改:用后置条件循环替换while循环(即首先复制零字节,然后检查它是否是结尾)。