我正在尝试将两个字符串复制到一个新指针中。这是将字符串指针和子指针连接在一起。尝试在新的指针字符串.what中生成输出是错误的吗?
void addsubstring( char* string, char* sub)
{
//int m = strlen(string);
char *str=(char*)malloc(sizeof(char)*10);
int n =0;
while( *string != '\0')
{
*(str) = *(string++);
printf("char is %c\n", str[n++]);
str++;
}
while( *sub != '\0')
{
*(str) = *(sub++);
printf("char is %c\n", str[n++]);
str++;``
}
printf("%s", str);
}发布于 2021-06-11 23:20:22
对于初学者来说,这种使用幻数10的内存分配使函数变得不安全。
char *str=(char*)malloc(sizeof(char)*10);在这些while循环中
while( *string != '\0')
{
*(str) = *(string++);
printf("char is %c\n", str[n++]);
str++;
}
while( *sub != '\0')
{
*(str) = *(sub++);
printf("char is %c\n", str[n++]);
str++;``
}指针str正在更改(递增)。因此,在循环之后,它指向一个垃圾。
并且您忘记在结果字符串中包含终止零字符的'\0'。
该函数可以按以下方式定义
char * addsubstring( const char *s1, const char *s2 )
{
size_t n1 = strlen( s1 );
char *result = malloc( n1 + strlen( s2 ) + 1 );
if ( result != NULL )
{
memcpy( result, s1, n1 );
strcpy( result + n1, s2 );
}
return result;
}这是一个演示程序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char * addsubstring( const char *s1, const char *s2 )
{
size_t n1 = strlen( s1 );
char *result = malloc( n1 + strlen( s2 ) + 1 );
if ( result != NULL )
{
memcpy( result, s1, n1 );
strcpy( result + n1, s2 );
}
return result;
}
int main(void)
{
char *p = addsubstring( "Hello ", "World!" );
if ( p ) puts( p );
free( p );
return 0;
}程序输出为
Hello World!如果您不能使用标准的C字符串函数,则可以按照下面的演示程序中所示来定义该函数
#include <stdio.h>
#include <stdlib.h>
char * addsubstring( const char *s1, const char *s2 )
{
size_t n = 0;
while ( s1[n] ) ++n;
while ( s2[n] ) ++n;
char *result = malloc( n + 1 );
if ( result != NULL )
{
char *p = result;
while ( *s1 ) *p++ = *s1++;
while ( ( *p++ = *s2++ ) );
}
return result;
}
int main(void)
{
char *p = addsubstring( "Hello ", "World!" );
if ( p ) puts( p );
free( p );
return 0;
}程序输出与上面显示的相同
Hello World!https://stackoverflow.com/questions/67939544
复制相似问题