在C语言中将一个字符串复制到另一个字符串
我想将源字符串复制到目标字符串。 上面的api返回null。 如果我使用字符数组(我已经评论过了),那么这个api对我有效 请帮助我理解两者的区别在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')
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);
然后有差异Addchar*dest1=dest代码>在malloc之后,然后返回dest1,这样就可以了
其他可能的更改:将while循环替换为post-condition循环(即,首先复制零字节,然后检查是否为结尾)。Addchar*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
指向最后一个字符。我意识到