C程序用函数连接两个指针字符串

C program to concatenate two pointer strings with functions

#include <stdio.h>
#include <stdlib.h>
    
char concaten(const char *str1,const char *str2);
    
int main()
    {
        printf("%s",concaten("Code","blocks"));
        return 0;
    }
    
char concaten(const char *str1,const char *str2) {
    int i=0,j=0;
    char *result;
    while(*str1){
        result[i++]=str1[i++];
    }
    while(*str2){
        result[i+j++]=str2[j++];
    }
    return result;
}

我写这个函数是为了获取两个字符串并将它们添加到另一个第三个字符串;我不明白我哪里出错了,因为它不打印任何东西。

除了你的函数不应该 return char 而应该 char* 之外,表达式 result[i++] = str1[i++]; 不正确它缺少一个序列点。此外 result 是一个单元化指针,它不能保存任何数据,你需要让它指向一些有效的内存位置。

你可以这样做:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* concatenate(const char* str1, const char* str2 ){

    char* result = malloc(strlen(str1) + strlen(str2) + 1);
    if (result){
        char* temp = result;
        while (*str1 != '[=10=]'){
            *temp++ = *str1++;
        }
        while (*str2 != '[=10=]'){
            *temp++ = *str2++;
        }
        *temp = '[=10=]'; // don't forget to null terminate the string      
    }
    return result; // if memory allocation fails a null pointer is returned
}

printf语句中直接使用该函数将不允许您释放内存,如果程序没有立即完成,您将发生内存泄漏,在这些情况下最好分配的 returned 指针不会丢失分配的内存:

int main(void){

    char *result = concatenate("Code", "blocks");
    if(result){
        printf("%s", result);
        free(result);
    } 
    return EXIT_SUCCESS;
}

你的 concaten 功能有很多问题。

首先,它应该返回一个 char* 指针,而不是 char;因此,声明应该是这样的:

char* concaten(const char* str1, const char* str2);

接下来,该函数将需要分配内存来存储连接的字符串;这可以通过 malloc() 函数来完成,所需的字符数将是两个输入字符串的长度之和 加上一个 ,对于所需的 nul-终结者.

第三,你这两个循环的逻辑是错误的。您在每个循环中递增 ij 两次 但不递增任何一个 source 指针。

最后,您必须在新字符串的末尾添加一个 nul 终止符。

这是应用了上述修复的版本:

char* concaten(const char* str1, const char* str2)
{
    int i = 0, j = 0;
    char* result = malloc(strlen(str1) + strlen(str2) + 1); // allow space for nul-terminator
    while (*str1) {
        result[i++] = *str1++; // Only increment i once and "str1" once
    }
    while (*str2) {
        result[i + j++] = *str2++; // Only increment j once and "str2" once
    }
    result[i + j] = '[=11=]'; // Add required nul-terminator
    return result;
}

此外,由于您已经分配了内存(使用 malloc 调用),因此您应该在处理完数据后使用对 free 的调用释放内存。以下是您的 main 的运作方式:

int main(void)
{
    char* answer = concaten("Code", "blocks");
    printf("%s", answer);
    free(answer);
    return 0;
}

注意:您也可以完全删除 j 变量,并在第二个循环中重新使用 result[i++] 表达式。我把它留在里面,以便您可以更轻松地将我的代码与您自己的代码相关联。

您的函数具有 return 类型 char

char concaten(const char *str1,const char *str2);

但在函数中您正在 return 变量 result

return result;

声明为 char *

类型的指针
char *result;

因此编译器将发出一条消息,表明您正在尝试将指针转换为整数。

函数必须声明为

char * concaten(const char *str1,const char *str2);

指针结果未初始化且具有不确定的值。您需要在写入连接字符串的位置分配内存。

如果 str1 and/or str2 由于条件

不是空字符串,函数中的 while 循环将是无限的
    while(*str1){

    while(*str2){

这些陈述

result[i++]=str1[i++];

result[i+j++]=str2[j++];

调用未定义的行为不仅因为指针 result 未初始化,而且因为在左操作数和写操作数之间没有序列点,其中使用了后缀增量运算符 ++.

此外,结果字符串必须以零结尾。

如果您不允许使用标准的 C 字符串函数,那么您的函数可以通过以下方式实现,例如

char * concatenate( const char *str1, const char *str2 )
{
    size_t n1 = 0;
    size_t n2 = 0;

    while ( str1[n1] ) ++n1;
    while ( str2[n2] ) ++n2;

    char *result = malloc( n1 + n2 + 1 );

    if ( result != NULL )
    {
       char *p = result;

       while ( *str1 ) *p++ = *str1++;
       do
       {
           *p++ = *str2;
       } while ( *str2++ );
    }

    return result;
}

此外,当不再需要结果字符串时,您不应该忘记释放分配的内存。

这是一个演示程序。

#include <stdio.h>
#include <stdlib.h>

char * concatenate( const char *str1, const char *str2 )
{
    size_t n1 = 0;
    size_t n2 = 0;

    while ( str1[n1] ) ++n1;
    while ( str2[n2] ) ++n2;

    char *result = malloc( n1 + n2 + 1 );

    if ( result != NULL )
    {
       char *p = result;

       while ( *str1 ) *p++ = *str1++;
       do
       {
           *p++ = *str2;
       } while ( *str2++ );
    }

    return result;
}

int main(void) 
{
    char *result = concatenate( "Code ", "blocks" );
    
    if ( result != NULL ) puts( result );
    
    free( result );
    
    return 0;
}

程序输出为

Code blocks

如果您可以使用标准的 C 字符串函数,那么函数 concatenate 看起来就像下面的演示程序所示。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * concatenate( const char *str1, const char *str2 )
{
    size_t n1 = strlen( str1 );
    size_t n2 = strlen( str2 );

    char *result = malloc( n1 + n2 + 1 );

    if ( result != NULL )
    {
        memcpy( result, str1, n1 );
        memcpy( result + n1, str2, n2 + 1 );
    }

    return result;
}

int main(void) 
{
    char *result = concatenate( "Code ", "blocks" );
    
    if ( result != NULL ) puts( result );
    
    free( result );
    
    return 0;
}

程序输出与上图相同,即

Code blocks