본문 바로가기

BackEnd/C

문자열의 정보 추출 함수들

반응형

1. strchr, strrchr


문자열에서 특정 문자가 등장하는 처음 또는 마지막 위치를 알고 싶을 때



함수 strchr은 두 번째 인자로 전달되는 문자가 처음 등장하는 위치를, 


첫 번째 인자로 전달되는 주소 값의 문자열에서 찾는다. 


그리고 찾으면 해당 문자의 주소 값을, 못 찾으면 NULL 포인터를 반환한다.


함수 strrchr의 기능도 strchr과 유사하다.


다만 차이점은 strrchr은 문자열의 끝에서부터 찾기 시작한다는 점에 있다.


즉 strrchr 함수는 찾고자 하는 문자가 등장하는 마지막 위치의 정보를 반환한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <string.h>
 
int main(void)
{
    char str[]="It is possible to master C in a month or two"
    char * chPtr;
 
    chPtr=strchr(str, 'i');
    printf("첫 번째 i 이후 문자열: %s \n", chPtr);
    
    chPtr=strrchr(str, 'i');
    printf("마지막 i 이후 문자열: %s \n", chPtr);
    
    return 0;
}
 
cs

1
2
첫 번째 i 이후 문자열: is possible to master C in a month or two
마지막 i 이후 문자열: in a month or two
cs


2.  strstr 


문자열 안에 특정 문자열이 존재하는지 확인하고 싶을 때



두 번째 매개변수로 전달된 문자열과 동일한 문자열 블록을 찾았을 시에는 해당 문자열의 주소 값이 반환된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h>
 
int main(void)
{
    char str[]="한글도 얼마든지 전달인자가 될 수 있습니다.";
    char * stPtr;
 
    stPtr=strstr(str, "가 될 수 있습");
    printf("시작 위치 이후 문자열: %s \n", stPtr);
 
    return 0;
}
 
cs


1
시작 위치 이후 문자열: 가 될 수 있습니다.
cs


3.  strtok


어떠한 기준을 가지고 문자열을 나눠야 하는 경우



첫 번째 전달인자에는 토큰을 나눌 대상이 되는 문자열의 주소 값이 전달되고, 두 번째 전달인자


에는 토큰의 기준 정보가 문자열의 형태로 전달된다.


그리고 여기서 말하는 토큰은 “특정 조건에 의해서 구분이 되는 문자열의 일부” 라는 의미로 사용이 되었다.


아래의 문자열을 보자. 


"AAA-BBB_CCC-DDD!EEE" 이 문자열을 기호 - 를 기준으로 토큰을 나누면,다음과 같이 총 세 개의 토큰이 형성된다. 


"AAA", "BBB_CCC", "DDD!EEE" 


그리고 이 문자열을 기호 -와 _를 기준으로 토큰을 나누면,다음과 같이 총 네 개의 토큰이 형성된다. 


"AAA", "BBB", "CCC", "DDD!EEE" 


이처럼 토큰이라는 것은 특정한 기준을 적용해서 나눠진, 문자열의 일부분을 의미한다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <string.h>
 
int main(void)
{
    char str[]="AAA-BBB_CCC-DDD!EEE";
    char * tok;
    int cnt=0;
    
    tok=strtok(str, "-_!");
 
    while(tok!=NULL)
    {
        cnt++;
        printf("토큰 %d: %s \n", cnt, tok);
        tok=strtok(NULL"-_!");
    }
 
    return 0;
}
 

cs


1
2
3
4
5
토큰 1: AAA
토큰 2: BBB
토큰 3: CCC
토큰 4: DDD
토큰 5: EEE
cs

 10행 : strtok 함수가 호출되면서 첫 번째 인자로 str이 전달되었으므로, 6행에 선언된 문자열을 대


으로 토큰이 나뉜다. 그리고 두 번째 인자로 문자열 "-_!“가 전달되었는데, 이는 토큰을 나누는 기준 


문자의 집합이다. 즉 문자열 str은 기호 -, _, !를 기준으로 토큰이 나뉜다. 그리고 이렇게 함수가 호출


이 되고 나면, 첫 번째 토큰의 주소 값이 반환된다.


• 16행 : 첫 번째 토큰의 정보는 10행을 통해서 얻었으므로, 두 번째 그리고 세 번째 토큰의 정보를 


어야 하는데, 이를 위해서는 16행과 같은 형태로 함수를 호출해야 한다. 즉 첫 번째 인자로는 NULL


을 전달해야 한다. 왜냐하면 10행의 함수 호출을 통해서 전달된 문자열 정보는 함수 내에서 유지가 되


고 있기 때문이다. 그리고 두 번째 인자인 토큰의 기준 정보는 동일하게 유지를 해야 한다.


• 12,16행 : 더 이상 반환할 토큰이 존재하지 않는 경우에는 NULL이 반환되므로, 16행의 함수 호출의 


결과로 NULL이 반환되면 while문을 빠져나가도록 구현하였다.


그리고 위와는 달리 추가적으로 보아야 할 예제가 있다.


 strtok 함수는 문자열을 변경시키는데, 예제를 보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h>
 
int main(void)
{
    char str[]="AAA-BBB_CCC-DDD!EEE";
    char * tok;
    
    tok=strtok(str, "-_!");
    printf("호출 이후 문자열: %s \n", str);
 
    return 0;
}
 

cs


1
호출 이후 문자열: AAA
cs


실행결과를 보면 strtok 함수의 호출 이후에 6행에 선언된 문자열이 변경되었음을 알 수 있다.


즉 , 기호 -_, ! 를 모두 널 문자로 바꾸기 때문에 AAA까지만 출력이된다. 


때문에 strtok 함수의 호출 이후에도 그 내용이 보전되어야 하는 문자열이라면, 


strtok 함수를 호출하기 이전에 원본을 복사해 두는 것이 좋다.


4. atof, atoi, atol, atoll


문자열에 저장되어 있는 숫자 정보를 실제 숫자로 변환



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    int num1;
    double num2;
    long num3;
 
    num1=atoi("123");
    num2=atof("-1.234");
    num3=atol("1234123");
 
    printf("%d, %g, %ld \n", num1, num2, num3);
    return 0;
}
 

cs


1
123-1.2341234123
cs


실행의 결과에서도 보여주듯이 문자열이 숫자로 바뀌었다.


 

반응형