본문 바로가기
리눅스

gcc에서 문자열처리

by 목가 2015. 11. 17.
반응형

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바이트를 넘는다면? 결코 즐겁지 않은 일이 발생하겠지요. ^^

출처 : http://forum.falinux.com/zbxe/index.php?mid=lecture_tip&page=94&document_srl=554733

반응형

'리눅스' 카테고리의 다른 글

[Virtual Box] Note PC + Virtual Box(Linux) 연동  (0) 2016.01.25
dd 명령어  (0) 2015.11.19
[리눅스 API] 파일 I/O 버퍼링  (0) 2015.08.30
[Vi 편집기] 고급 기능  (0) 2015.08.22
[리눅스] 파일에서 내용 한번에 바꾸기  (0) 2015.08.20

댓글