강좌 & 팁
Pascal을 사용하다가 C를 사용하다 보면 제일 답답한 것이 Pascal의 String과 같이 편리한 문자열 처리 변수 타입이 없다는 것입니다. 지금도 이해가 안 되는데, Pascal보다 이후에 나온 C에서 왜 String 변수 타입을 추가하지 않았을까 하는 점입니다. 파스칼은 1969년에 스위스 ETH 취리히의 컴퓨터 과학자 니클라우스 비르트가 개발되었죠. C언어는 1970년에 개발된 B언어를 바탕으로 1972년 켄 톰슨과 데니스 리치에 의해 만들어 졌습니다. B언어에 String 변수 타입이 없었기 때문이 가장 큰 이유이겠지만, C언어 개발자가 파스칼의 String 변수에 대해 몰랐거나(몰랐다고 말하기에는 힘들겠지만,) 알았어도 필요성을 느끼지 못했기 때문일지 모르겠습니다. 어찌 되었든 C언어에 String 변수 타입이 없는 것은 C 언어 개발자에게는 매우 불행한 일이 아닐 수 없습니다.
현재 고급 언어에는 대부분은 String 변수 타임을 가지고 이죠. 아래와 같이 C 언에서도 문자열을 처리할 수 있다고 생각해 보십시오. 신나지 않습니까?
string str_name;
string str_introdue;
string str_age;
str_name := "장길석";
str_introduce := "제 이름은 " +str_name+" 입니다.";
str_Introduce += " 그리고 나이는" + int_to_str( n_age) +"살 입니다." ;
str_age = index( str_introduce "나이는");
그러나 C 언어에는 String 변수가 없습니다. 어쩔 수 없는 일인만큼 문자열을 잘 다루기 위해 관련 함수를 잘 알아 두는 것이 좋겠습니다. 제가 애용하는 함수입니다.
#include <strings.h> #include <stdio.h> int main() { char data[] = "hello:world=ok"; char *sp, *dp; char mydata[20] = {0x00,}; sp = index(data, ':'); dp = rindex(data, '='); strncpy(mydata,sp+1, dp-sp-1); printf("[%s]\n", mydata); }
#include <string.h> int main() { char *me = "my name=yundream"; char *mp; mp = strstr (me, "///")+1; printf("%s\n", mp); }
#include <string.h> int main() { char *a = "abcdef"; char *b = "abcdefg"; printf("%d\n", strncmp(a, b, 4)); }
#include <strings.h>
#include <stdio.h>
int main()
{
char data[] = "hello:world=ok";
char *sp, *dp;
char mydata[20] = {0x00,};
sp = index(data, ':');
dp = rindex(data, '=');
strncpy(mydata,sp+1, dp-sp-1);
printf("[%s]\n", mydata);
}
#include <stdio.h> #include <stdlib.h> int main() { printf( "%d\n", atoi( "-567")); // 문자열을 integer 로 변환 printf( "%d\n", atol( "-567")); // 문자열을 long 로 변환 }
char tmp[100];
char *tmp2 = "123456789";
memset( tmp, 'j', 100);
strcpy( tmp, tmp2); // strcpy()는 문자열에서 NULL 까지만 복사합니다.
printf( "%s\n", tmp);
strncpy( tmp, tmp2, strlen( tmp2)); // 그러나 strncpy()는 NULL이 있어도 포함해서 개수만큼 복사합니다.
printf( "%s\n", tmp);
#include <CTYPE.H> void to_upper_str( char *buff) { while( *buff) *buff++ = (char)toupper( (char)*buff); }
▶ 그리고 매우 중요한 sprintf() 함수. 서식에 맞추어 문자열을 만들어 줍니다. 제가 매우 애용하는 함수입니다.
#include <stdio.h> int main( void) { char ptr[1024]; int ret; ret = sprintf( ptr, "%d %x %s", 123, 123, "forum.falinux.com"); printf( "ret=%d ptr=%sn", ret, ptr); return 0; }
sprintf()는 매우 편리한 함수이지만, 주의하셔야 할 것이 있습니다. 서식에 의해 만들어지는 문자열의 길이가 버퍼보다 작아야 한다는 점입니다. 위의 예에서 ptr의 크기가 1024바이트인데, sprintf()가 서식에 맞추어 대입할 문자열이 1024바이트를 넘는다면? 결코 즐겁지 않은 일이 발생하겠지요. ^^