2014-10-23 5 views
0

그래서 두 개의 문자열을 C로 연결하는 함수를 만들어야합니다. 이 함수는 str1과 str2를 연결하여 새 문자열을 만듭니다. 함수는 malloc() 또는 calloc()을 호출하여 새 문자열에 메모리를 할당해야합니다. 함수는 새 문자열을 반환합니다.C에서 두 문자열 연결하기

주 테스트 함수에서 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. 
} 
+3

코드를 제대로 할 때 들여하십시오 C. – crashmstr

+1

에'malloc'을 캐스팅하지 마십시오 여기에 게시. –

+2

'* final_string = '\ 0'; return final_string;'--- 당신이 돌아 오는 것을보십시오, 여기. –

답변

4

final_string을 돌려 주지만 알고리즘 과정에서 문자열의 시작이 아닌 널 종결자를 가리 키도록 증가되었습니다. 나중에 다음

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

그리고 :

당신처럼 뭔가 할당을 변경해야

return final_string_return; 
+0

대단히 감사합니다 !!! – Bg601

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 (즉 my_strcat 호출하면 결코 free 결과,하지만 당신은해야한다)입니다.

디버거에서 프로그램을 단계별로 실행할 수 있으므로 경고 및 디버그 정보 (예 : , GCC)로 컴파일하는 습관을 갖고 디버거 사용 방법을 알아보십시오 (gdb). valgrind을 사용하여 일부 메모리 누수를 검사하여 - 감지합니다.

+0

제안 해 주셔서 감사합니다. 나는 그 중 일부에 대해 교육하려고 노력할 것이다. 이 시점에서, 그리고 나의 지식 수준으로 당신의 마지막 단락은 내 머리 위로 몇 마일 갔다. – Bg601

-2

final_string 점을 대상 문자열의 끝.

다음 코드는 최종 문자열을 반환

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

final_string의 주소에서 str1의 길이 - str2의 길이 빼기 - 1은 스택의 어딘가에있는 la-la land를 가르 킵니다 – user3629249

+0

final_string의 주소는 str1의 길이보다 짧을 것입니다. str2의 길이를 더하면 1입니까? ... – qeesung

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. 
} 
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; 
}