본문 바로가기

Lang/C

[C] C 문법 공부 #3 문자열 함수

728x90

# 문자열 함수 헤더

#include <string.h>
함수 설명
strcpy ( 대상문자열, 소스문자열 ) 소스 문자열을 대상 문자열에 복사합니다.
strncpy (대상, 소스, 길이 ) 소스 문자열의 일부분을 대상 문자열에 복사합니다.
strcat (대상, 소스 ) 소스 문자열을 대상 문자열의 뒤에 붙입니다.
strncat (대상, 소스, 길이 ) 소스 문자열의 길이만큼 대상 문자열 뒤에 붙입니다.
strcmp ( 문자열1, 문자열2 ) 두 문자열의 크기를 비교합니다.
strncmp (문자열1, 문자열2, 길이 ) 두 문자열의 길이까지의 크기를 비교합니다.
stricmp ( 문자열1, 문자열2 ) 대소문자 구분하지 않고 두 문자열의 크기를 비교합니다.
strnicmp (문자열1, 문자열2, 길이 ) 대소문자 구분하지 않고 두 문자열의 길이까지의 크기를 비교합니다.
strchr ( 대상, 소스문자 ) 문자열에서 문자를 발견하면 그 주소를 리턴합니다. 없으면 null 리턴.
strrchr (대상, 소스문자 ) strchr()를 뒤에서 앞쪽으로 검색합니다.
strstr ( 대상문자열, 소스문자열 ) 전체문자열에서 일부문자열이 있으면 그 시작주소를 리턴합니다.
strpbrk (대상, 소스) 문자열에서 문자를 발견하면 그 주소를 리턴합니다.
소스문자열의 개별 문자들을 모두 인식합니다.
strtok (대상, 소스) 문자열에서 소스를 만나면 그 전까지의 문자열을 리턴하고,
현재위치를 null로 만든 후 기억합니다.
strtok(NULL, 소스) 로 기억한 위치부터 재시작할 수 있습니다.
strset ( 대상, 소스문자 ) 문자열을 소스문자로 채웁니다.
strnset ( 대상, 소스문자, 길이 ) 문자열에 소스문자를 길이만큼 채웁니다.
strlwr ( 문자열 ) 문자열을 모두 소문자로 변환합니다.
strupr ( 문자열 ) 문자열을 모두 대문자로 변환합니다.
strrev ( 문자열 ) 문자열의 배열을 역순으로 바꿉니다.

# strcpy, strncpy

char str1[10] = "aaaaaa";
char str2[10];
char str3[10] = "bbbbbb";
char str4[10] = "123456";

strcpy(str2, str1);		// str1을 str2에 복사한다.
printf("%s\n", str2);

strncpy(str3, str2, 3); 	// str2[2]까지 str3에 복사한다.
printf("%s\n", str3);

strncpy(str3+1, str4+2, 4);	// str4[2]부터 4글자를 str3[1]에 복사한다.
printf("%s\n", str3);
aaaaaa
aaabbb
a3456b

# strcat, strncat

char str1[10] = "서울";
char str2[10] = "특별시";

strcat(str1, str2);		// str2를 str1 뒤에 붙인다.
printf("%s\n", str1);
	
strncat(str1, "중구신당동", 4);	// 두번째 매개변수 문자열의 4바이트만큼을 str1 뒤에 붙인다.
printf("%s\n", str1);
서울특별시
서울특별시중구
한글은 한 글자에 2바이트씩 차지하므로 세번째 매개변수를 4로 넣으면 두 글자를 가져옵니다.
3이나 5와 같이 홀수로 넣으면 뒤에 깨진 문자가 붙게됩니다.

* 빈 문자열에 strcat()을 사용하여 문자열을 여러번 붙여넣고 싶을 때
빈 문자열에 가장 처음 문자열을 붙여넣을 때 strcat()을 사용하면 '\0' 문자가 없어 문자열 에러가 발생합니다.
따라서 가장 처음에는 strcpy()를 사용하여 빈 문자열을 '\0'이 있는 문자열로 만들어준 다음
그 다음부터 strcat()를 여러번 사용하면 됩니다.
확실치는 않지만 strcat()는 기존 문자열의 마지막 문자와 '\0' 사이에 공간을 확보하여 문자열을 끼워 넣느라,
새롭게 '\0' 문자를 붙이진 않는 것 같습니다.

# strcmp, strncmp, stricmp, strnicmp

char str1[10] = "a";
char str2[10] = "a";

printf("%d\n", strcmp(str1, str2));	// 두 문자열의 크기가 같아서 0을 리턴.
printf("%d\n", strcmp("a", "b"));	// 아스키코드 a=65, b=66 으로 b가 더 큽니다.
printf("%d\n\n", strcmp("c", "b"));	// 아스키코드 c=67, b=66 으로 c가 더 큽니다.


char str3[10] = "홍길동";
char str4[10] = "홍두깨";

printf("%d\n", strncmp(str3, str4, 2));		// 한글 한 글자까지 비교해서 같습니다.
printf("%d\n\n", strncmp(str3, str4, 4));	// 한글 두 글자까지 비교해서 다릅니다.
	
if(stricmp("DOG", "dog")==0)		// 대/소문자를 구분하지않고 비교해줍니다.
	printf("같습니다.\n");
else printf("다릅니다") ;
0
-1
1

0
-1

같습니다.

 

# strchr, strrchr

char str[10] = "notebook";
	
printf("%d\n",  strchr(str, 'o'));	// 앞에서부터 o를 찾아 str[1]의 주소를 리턴합니다.
printf("%d\n",  strchr(str, 'x'));	// x가 없기 때문에 0 값을 리턴합니다.
printf("%d\n",  strrchr(str, 'o'));	// 뒤에서부터 o를 찾아 str[6]의 주소를 리턴합니다.
	

int count =0;
char *ptr;
	
for(ptr=str;;){		// str[0]을 가리킨체로 시작
	
    // 현재 포인터가 가리키는 주소에서부터 o를 찾습니다.
    // 여기서 처음에는 첫번째 o가 있는 str[1]을 가리킵니다.
    ptr = strchr(ptr, 'o');	
	
	if(ptr==NULL) break;	// 더이상 o를 찾지 못하고 NULL값을 리턴하면 멈춥니다.
	
	count++;
    
    // 포인터가 다음 주소를 가리키도록 +1 해줍니다.
    // 위에서 str[1]이었으므로 str[2]를 가리킵니다.
	ptr++;	
}
printf("문자 o가 %d개 있습니다.\n", count);
6487553 ( 실제 출력되는 주소를 다릅니다. )
0
6487558 (실제 출력되는 주소를 다릅니다. )
문자 o가 3개 있습니다.

 

# strstr

char str[100] = "서울특별시 중구 신당동";

// str문자열에 "신당" 문자열이 있으면 그 시작 위치의 주소를 리턴합니다.
// 없으면 0, NULL값을 리턴합니다.
if(strstr(str,"신당")!=0)
	printf("신당동 주소입니다.\n");
else
	printf("신당동 주소가 아닙니다.\n") ;
신당동 주소입니다.

 

# strpbrk

char str[100] = "이름: 홍길동, 나이: 24";
	
// 문자열 str에서 0 ~ 9 중 가장 먼저 발겨되는 문자의 위치를 리턴합니다.
// 여기서는 str[20]의 주소를 리턴합니다.
printf("%d\n", strpbrk(str, "0123456789"));

// 발견되지 않으면 0, NULL값을 리턴합니다.
printf("%d\n", strpbrk(str, "abcdefghijklmnopqrstuvwxyz"));
6487579
0

 

# strtok

char str[100]  = "서울시 중구 신당동 신당아파트 888동 333호";
char *ptr;

// 첫 번째 " " 만나면 이전까지의 문자열을 ptr에게 리턴하고
// 현재위치를 NULL처리한 후 기억합니다.  (여기에서는 str[6])
ptr=strtok(str, " ");	

while(ptr!=NULL){
	puts(ptr);		// ptr이 받은 주소값부터 NULL처리된 위치까지의 문자열을 출력합니다.
	ptr = strtok(NULL, " ");// 기억된 NULL위치부터 다음 " "위치까지 진행합니다.
}
서울시
중구
신당동
신당아파트
888동
333호

# strset, strnset, strlwr, strupr, strrev

char str[7]="aaaa";

strset(str, 'b');	// 문자열을 b로 채웁니다.
printf("%s\n", str);

strnset(str, 'c', 2);	// str[0] ~ [1] 까지 c로 채웁니다.
printf("%s\n", str);

strupr(str);		// 문자열을 모두 대문자로 변환합니다.
printf("%s\n", str);

strlwr(str);		// 문자열을 모두 소문자로 변환합니다.
printf("%s\n", str);

char str2[11] = "abcdefghij";
strrev(str2);		// 문자열을 현재의 역순으로 재정렬합니다.
printf("%s\n", str2);

char str3[11] = "가나다라마";
strrev(str3);		// 1바이트단위로 계산하기 때문에 한글은 적용되지 않습니다.
printf("%s\n", str3);
bbbb
ccbb
CCBB
ccbb
jihgfedcba
(깨진문자열이 출력됩니다)
728x90