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.234, 1234123 | cs |
실행의 결과에서도 보여주듯이 문자열이 숫자로 바뀌었다.
'BackEnd > C' 카테고리의 다른 글
전처리기(Preprocessor)와 매크로 (0) | 2019.03.21 |
---|---|
sprintf & sscanf (0) | 2019.03.21 |
문자열 컨트롤 함수들(strlen,strcpy,strncpy,strcat,strncat,strcmp,strncmp) (0) | 2019.03.20 |
puts,putchar,gets,getchar 함수와 버퍼 (0) | 2019.03.19 |
함수 포인터를 인자로 요구하는 표준 함수들(atexit, qsort, bsearch) (0) | 2019.03.18 |