c 에서 문자열의 끝을 알기 위한 방법으로 문자열 끝에 NULL  즉 '\\0' 값을 붙여둔다.

니가 str 에 apple 을 입력 받았을때 실제 str 에는

str[0] = a
str[1] = p
str[2] = p
str[3] = l
str[4] = e
str[5] = '\0' <---  문자열 끝을 표시한다.


이렇게 저장된다.

그리고 니가 복사했을때

puts(str2); //글자가 깨짐  

이 현상이 나타나는 이유는

str2[0] : e
str2[1] : l
str2[2] : p
str2[3] : p
str2[4] : a

만 저장되어서 그렇다..  puts 는 찍을때 '\0' 가 나올때 까지 찍기 때문에 깨지는거야

str2[5] = '\0'
를 추가해주면 깨지지 않고 잘 찍힌다.


   for(i=0; i<str_len; i++)
   {
      str2[index]=str[i];
      index--;
   }
 다음 줄에

str2[str_len] = '\0';

를 추가해주면 니가 원하는 결과를 얻을 수 있을꺼야..

str2 를 초기화 하는것은  str2[100] 의 저장공간에 미리 '\0' 으로 채워둠으로 같은 효과가 나온다.


아래는 strcat 의 정의니까 참고해..
================================================
STRCAT(3)                  리눅스 프로그래머 매뉴얼                  STRCAT(3)

이름
       strcat, strncat - 두 문자열을 연결시킨다.

사용법
       #include <string.h>

       char *strcat(char *dest, const char *src);

       char *strncat(char *dest, const char *src, size_t n);

설명
       strcat()  함수는 dest의 마지막 ‘\0’ 문자를 겹쳐서 src 문자열을 dest 문자열에 추가시킨다. 그리고마지막에 ‘\0’ 문자를 추가시킨다.  문자열은
       중첩되지 않으며 dest 문자열은 결과를 위해 충분한공간을 가지고 있어야 한다.

       strncat() 함수는 src의 처음 n문자들만 dest에추가시키는것을 제외하고는 비슷하다.

반환값
       strcat()와 strncat() 함수는 결과 스트링 dest에 대한포인터를 반환한다.

호환
       SVID 3, POSIX, BSD 4.3, ISO 9899

관련 항목
       bcopy(3), memccpy(3), memcpy(3), strcpy(3), strncpy(3)

역자
       정강훈 <skyeyes@soback.kornet.net>, 2001년 2월 24일

GNU                             1993년 4월 11일                      STRCAT(3)
====================================================================