首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >连接两个字符串但得到null。请纠正我这方面的错误

连接两个字符串但得到null。请纠正我这方面的错误
EN

Stack Overflow用户
提问于 2021-06-11 23:18:23
回答 2查看 66关注 0票数 0

我正在尝试将两个字符串复制到一个新指针中。这是将字符串指针和子指针连接在一起。尝试在新的指针字符串.what中生成输出是错误的吗?

代码语言:javascript
复制
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);
}
EN

Stack Overflow用户

发布于 2021-06-11 23:20:22

对于初学者来说,这种使用幻数10的内存分配使函数变得不安全。

代码语言:javascript
复制
char *str=(char*)malloc(sizeof(char)*10);

在这些while循环中

代码语言:javascript
复制
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'

该函数可以按以下方式定义

代码语言:javascript
复制
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;
}

这是一个演示程序

代码语言:javascript
复制
#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;
}

程序输出为

代码语言:javascript
复制
Hello World!

如果您不能使用标准的C字符串函数,则可以按照下面的演示程序中所示来定义该函数

代码语言:javascript
复制
#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;
}

程序输出与上面显示的相同

代码语言:javascript
复制
Hello World!
票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67939544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档