在C中连接两个字符串

时间:2014-10-23 14:45:34

标签: c string

所以我必须创建一个函数来连接C中的两个字符串;该函数通过连接str1和str2创建一个新字符串。该函数必须调用malloc()或 calloc()为新字符串分配内存。该函数返回新字符串。

在主测试函数中执行以下对printf()的调用之后:printf(“%s \ n”,myStrcat(“Hello”,“world!”));屏幕上的打印输出必须是Helloworld!

到目前为止,这是我的代码;我不太明白为什么它不起作用。它没有做任何事情......它编译并运行但没有显示任何内容。

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

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

int main()
{
    printf("%s", my_strcat("Hello", "World")); // test function. Output of print statement    is supposed to be HelloWorld
}

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

    char *temp1 = str1; // initializing a pointer to the first string
    char *temp2 = str2; // initializing a pointer to the second string

    // dynamically allocating memory for concatenated string = length of string 1 + length of string 2 + 1 for null indicator thing.
    char *final_string = (char*)malloc (strlen(str1) + strlen(str2) + 1);

    while (*temp1 != '\0') //while loop to loop through first string. goes as long as temp1  does not hit the end of the string
    {
        *final_string = *temp1; // sets each successive element of final string to equal each successive element of temp1
        temp1++; // increments address of temp1 so it can feed a new element at a new address
        final_string++; // increments address of final string so it can accept a new element at a new address
    }
    while (*temp2 != '\0') // same as above, except for string 2.
    {
        *final_string = *temp2;
        temp2++;
        final_string++;
    }

    *final_string = '\0'; // adds the null terminator thing to signify a string
    return final_string; //returns the final string.
}

5 个答案:

答案 0 :(得分:4)

你正在返回final_string,但是在你的算法过程中它会增加指向空终止符 - 而不是字符串的开头。

您需要将分配更改为:

char *final_string_return = malloc(strlen(str1) + strlen(str2) + 1);
char *final_string = final_string_return;

然后是:

return final_string_return;

答案 1 :(得分:3)

你应该在另一个变量中存储malloc的结果(你应该总是对失败进行测试):

char *result_string = malloc (strlen(str1) + strlen(str2) + 1); 
if (!result_string) { perror("malloc"); exit(EXIT_FAILURE); };
final_string = result_string;

最后归还

return result_string;

所以名字final_string是不幸的;也许current_pointer

顺便说一下,你的函数只能使用约定调用者应该释放它的结果。您应该记录该惯例(至少在评论中)。特别是在main函数

printf("%s", my_strcat("Hello", "World"));

memory leak(您永远不会free my_strcat调用的结果,但您应该这样做。

请养成使用警告和调试信息进行编译的习惯(例如gcc -Wall -Wextra -gGCC),并学习如何使用调试器(gdb),因为您可以一步一步你的程序在调试器中。还可以使用valgrind来检测 - 通过测试 - 一些内存泄漏。

答案 2 :(得分:0)

int main( void )
{
    char * concatStr = my_strcat("Hello", "World");

    printf("%s", concatStr); // test function. 
    // Output of print statement    is supposed to be HelloWorld
    free( concatStr ); // note this is safe, even if my_strcat() returns NULL
    return(0);
}

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


    // dynamically allocating memory for concatenated string 
    // = length of string 1 + length of string 2 + 1 for null indicator thing.
    // and sets all bytes to '\0'
    char *final_string = calloc ((strlen(str1) + strlen(str2) + 1), 1);
    if( NULL == final_string )
    { // then calloc() failed
        return( NULL );
    }
    // implied else, calloc() successful

    strcpy( final_string, str1 );
    strcat( final_string, str2 );

    return( final_string ); // note: caller must invoke free() 
                            //       to avoid memory leak.
}

答案 3 :(得分:0)

您可以随时使用sprintf

char* my_strcat(const char* const s1, const char* const s2)
{
    char *dst = malloc(strlen(s1) + strlen(s2) + 1);
    if (dst == NULL)
    {
      return NULL;
    }
    sprintf(dst, "%s%s", s1, s2);
    return dst;
}

答案 4 :(得分:-2)

final_string指向目标字符串的末尾。

以下代码返回最终字符串:

return (final_string-strlen(str1)-strlen(str2)-1); //returns the final string.