将字符串复制到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++;
你在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("\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); }
我的看法:
避免在被调用函数中分配内存,在调用函数之前更好地分配内存
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++);
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++ = *source++;
如果以这种方式定义dest
则没有区别并且应该有效
char *dest = (char*)malloc(sizeof(char)*len);
如果您的数组以这种方式定义:
char dest[len];
然后有区别
您不应该返回已分配的字符串。 这很容易导致内存泄漏。
相反,你应该考虑将分配的内存传递给你的函数来复制它。 如果出现任何问题,您可以使用返回值返回错误。
这会将您的签名更改为。
int stringcopywithpointer( char * dest, const char *source)
为了让您的代码更加通用,您可以实现vargs,您的签名将是:
int stringcopywithpointerf( char * dest, const * format, ... );
这实际上是已经存在的函数sprintf。
int sprintf( char * dest, const * format, ... );
还有可用和预制function的安全变体。 您可能需要考虑使用其中之一。
如果这是相关的功课,请看看这个function:
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; }
您可能希望像在原始post中使用它们(malloc等)一样添加错误检查。
“请帮助我理解dest [i ++]和* dest ++之间的区别”
dest [i ++]不会增加指针,而是增加指针的索引。 * dest ++在访问其原始contendt后递增指针。
添加char *dest1 = dest;
在malloc之后,然后返回dest1,这将工作。
其他可能的更改:使用后置条件循环替换while循环(即先复制零字节,然后检查它是否为结束)。
可能你需要添加这一行
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; }