Google

«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
BLOG Total Visitors
Today Hit, Yesterday Hit
BLOG main image


visitor stats
[Schizo!, 2007. 12. 26. 06:48, study/programming]

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

char *hap(char *a,char *b){
 int i,j;
 char *temp;
 temp=(char*)malloc(strlen(a)+strlen(b));
 for(i=0;i<strlen(a);i++)
 temp[i]=a[i];
 for(j=0;j<strlen(b);j++)
 temp[i+j]=b[j];
 temp[i+j]='\0';
 return temp;

}


int main(void){
 char *str1="dog";
 char *str2="house";
 char *str;
 str1=hap(str1,str2);

 printf("%s",str1);
 return 0;
}



#include <stdio.h>
#include <stdlib.h>
int main()
{
    char str1[10]="cat";
    char str2[10]="house";
    int i,j;
   
    for(i=0;str1[i] != '\0';i++);//str1의 끝을 알아냅니다.(i의 위치)
   
    for(j=0;str2[j] != '\0';j++)//str2의 끝까지 돌려 줍니다.
       str1[i+j]=str2[j];//i는 str1의 마지막 위치 j를 더해주면서 str2의 문자를 하나씩 추가 해줌
   
    str1[i+j]='\0';//문자열 끝부분에 널문자를 넣어줌  
      
    printf("%s",str1);//결과 확인

    system("pause");
    return 0;
}


 ㅇ_ㅇ 기본적인 메카니즘은

 1개의 공간에 나머지 문자를 붙이는 것이랍니다.


 char* chStr1 = "cat";

 char* chStt2 = "house";


 라고 있을때

 Length 함수를 사용하면 길이를 구할수 있답니다.

 더 근본적으로 사용하면 \n 이 나올때까지 loop를 돌아서

 갯수를 파악하지요.


 cat는 0,1,2 까지 들어간 3개의 문자열입니다.

 이 뒤에 5개의 문자를 가져다가 넣으면 끝나지요.


 하지만 chStr1 이란 공간은 3개만 할당되어 있습니다.

 더 넣을 필요가 있겠지요?


 char* copyString(char* chStr1, char* chStr2)

 {

     char* chTemp = (char*)malloc(sizeof(char)*(Length(chStr1)+Length(chStr2));

     // chTemp 라는 저장공간에 chStr1, chStr2 만큼의 공간을 할당합니다.

     // 예제대로라면 8개의 공간이 할당되겠지요.


    for(int i = 0; i < length(chStr1); i++)

        chTemp[i] = chStr1[i];

    // 요렇게 하면 chTemp에는 "Cat" 이 들어갑니다.


    for(int i = 0; i < Length(chStr2); i++)

        chTemp[Length(chStr1) + i] = chStr2[i];

    // 이러면 chTemp 는 "Cathouse" 라는 문자가 들어갑니다.

    // 즉 Cat을 하나씩 넣어준후에 그 뒷공간에 house를 가져다 넣는것이지요.


    return chTemp;

 }

 요렇게 하면 반환되는 것은 "cathouse"가 반환되겠죠?

 이런 메카니즘이랍니다.

 strcpy도 비슷해서

 2개의 공간을 받아서 메모리를 잡고 앞의 공간을 지운후에

 새로운 공간을 넣어서 복사해 나가는 것이랍니다.

 CString 같이 String을 전문적으로 처리해주는 Class도 비슷하게 돌아가지요.





string str1="kor";
string str2="jpn";
char *i[]={NULL};

*i=&str1;
*i+1=&str2;

printf(%s,"i");




C 언어의 경우.. 문자열 정보 맨마지막에는 0x00(\0)의 정보를 가지고 있습니다..

즉, 각 문자열을 구분하는 것은 아무것도 있지 않는 0 이라는 정보지요.. ('0' 과는 다릅니다..)


그리고 문자열이 합쳐지는 변수에는 그냥 포인터로 설정하시면 안 됩니다.

이유는 주소가 어디로 되어 있는지 알 수 없는 포인터에 자료를 쓰게되면 다운에 이를 수 있습니다..


char *str1 = "kor";

char *str2 = "jpn";


두개의 문자열이 있습니다.. 이때 이 두개의 문자열을 str 이라는 변수에 합쳐서 저장하고 싶다면..

우선 str 변수를 선언해야겠지요.. 포인터 변수로 정의하고 싶으시다면..

그 내용이 저장될 배열 변수도 필요합니다.


char *str, str_real[128];

str = &str_real[0]; // 포인터 변수 str 을 정의하고 그 내용을 저장할 str_real 배열을 선언 후 그 주소를 대입.


이제 준비는 끝났습니다.. 합치기만 하면 되죠..


char *tmp; // 이건 포인터를 이용해서 편리하게 문자열을 복사하기 위함입니다..


tmp = str1;

while ( *tmp ) // 0x00 이 아니면 while문 반복합니다.

  *str++ = *tmp++; // 여기서 주의할 점은 괄호를 사용하면 큰일납니다. ++ 이 먼저 실행되어서 이상해집니다.


이것으로 str1의 데이터가 str으로 복사되었습니다. str2 도 똑같이 반복해주면 됩니다.


tmp = str2;

while ( *tmp ) *str++ = *tmp++;


자, 여기서 끝난것이 아닙니다.. 처음에 설명드렸듯이 문자열의 끝에는 0x00 이 붙어야한다고 했지요..

현재 str 포인터가 가르키고 있는 위치는 str1과 str2를 합치고 난 뒷부분입니다..


*str = 0x00; // 그냥 *str = 0; 해도 됩니다만.. 확실하게 구분짓기 위해.. 0x00 이라 사용합니다.. 눈에 띄라고;;

str = &str_real[0]; // 이제 문자열 합치기가 끝났으므로.. str의 주소값을 원래대로 복구합니다.


puts ( str ); // 이제 출력하면.. str1 과 str2 가 합쳐진 korjpn 이라는 결과가 나오게됩니다.


[[[[ 다소 복잡하지만.. 포인터를 이해하는데는 더없이 좋은 예제입니다.. ]]]]


위의 설명을 이용하여 2개의 문자열을 하나로 합치는 함수를 작성해 보겠습니다.


void my_strcat ( char *src1, char *src2, char *des )

{

  while ( *src1 ) *de

}

'study > programming' 카테고리의 다른 글

공부  (0) 2008.01.16
웹기반 다이어그램 제작 툴  (0) 2008.01.05
후위식.  (0) 2007.12.25
memset 함수  (0) 2007.12.17
이분검색  (0) 2007.12.14


본인의 아이피 주소 확인과 위치 추적