所以我必须创建一个函数来连接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.
}
答案 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 -g
和GCC),并学习如何使用调试器(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.