- favicon.ico Generator
- Ferry Halim
- interfaceLIFT
- 클리앙
- 쿨엔조이
- 플레이웨어즈
- 윈도우포럼
- 보드나라
- i-funbox
- firefox
- chris jordan
- 매니캠
- 웹캠
- 아이팟mp3뽑기
- star cd key
- kbs포토뱅크
- Vimeo
- 4shared
- snoopybox
- 인터넷라디오
- RaySoda
- 더어플 :: 내 손안에 작은세상
- love:paradox
- 룩포박스
- 월간잉여
- 디지의 수상한 공작소
- 일본
- SLRCLUB
- 차도녀의 싱글라이프
- Serepim의 코믹 스페이스
- Freemake
- NBA Mania
- 게티이미지뱅크
- 알바정리
- 팝코넷
- 기글하드웨어
- cj더키친
- Fantastic Typoon
- 한국관광공사
- 3uTools
- 브릭캠퍼스
- 다인의 편의점 이것저것
- foobar2000
- Wallpaper
- simplehuman
- 퀘이사존
- SoundCloud
- 예판넷
- 올파츠
- 퀘이사존
- 비플릭스
- 엔공구
- 마베르만
- 오토브라이트 다이렉트
- 토에이 온라인 스토어
- Road Trail Run
- Apple System Status
- 쿼라
- 슈프라이즈 - 스니커즈 발매정보
- 풋셀 커뮤니티
- 럭키드로우
- 통관알리미
- Tears of the Kingdom MAP
- Tears of the Kingdom MAP 2
- SWITCH WORLD
- dprime
- 데일리슬슬
- 핫썰
- 핫딜
- 번코 - 세상의 모든 자막
- 에펨코리아
- MY FREE MP3
- 영s의 브런치스토리
- 메타크리틱
- 오픈크리틱
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 윤종신
- 개봉기
- 지산락페
- 비보이
- 티스토리초대
- 진중권 블로그 100분토론 디워
- 키스 플린트
- V60 CC
- 행보
- u2
- 살라
- 스타크래프트2
- U2내한공연
- 섬머소닉
- UK B-Boy Championships
- 키스플린트
- 김사랑
- 존프루시안테
- 율량
- V60 크로스커트리
- 밸리록
- 섬머소닉 2차
- 윈도우7
- 정보처리산업기사
- 티스토리 초대장
- 마재윤
- 티스토리 초대장/ 티스토리초대
- 펜타포트
- 청주
- DDT4ALL
- Today
- Total
알고리즘
문자열 연결 strcat 안씀. 본문
#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 |