관리 메뉴

공부 기록장 💻

[C언어] 문자열 처리 함수 <string.h> 본문

# Language & Tools/C

[C언어] 문자열 처리 함수 <string.h>

dream_for 2021. 2. 1. 20:46

 

 

<string.h> 헤더 파일에 정의되어 있는 문자열 처리 라이브러리 함수들

 

 

size_t strlen(const char *str);

- 기능: 문자열의 길이 반환
- 인수: 문자열 주소
- 반환값: 문자열의 길(마지막 NULL값 제외)

 

 

#include <stdio.h>
#include <string.h>

int main(void) {
	
	char str1[10] = "Hi";

	printf("%s의 문자열 길이 : %d\n", str1, strlen(str1));
	printf("Hello 의 문자열 길이 : %d\n", strlen("Hello"));

	return 0;
}

 

 

 

char *strchr(const char *str, int c);

- 기능: 문자열에서 문자를 찾는다.
- 인수: 찾을 대상 문자열, 찾는 문자
- 반환값: 첫 번째 찾은 문자의 위치 주소, 찾지 못한 경우 NULL


char *strstr(const char *str1, const char *str2);

- 기능: str1에서 문자열 str1를 찾아 그 포인터를 반환
- 인수: 찾을 대상 문자열, 찾는 문자열
- 반환값: 찾은 첫 번째 문자열 포인터

 

#include <stdio.h>
#include <string.h>

int main(void) {
	
	char str1[] = "Programmers";
	char str2[] = "Hi, Programmers!";
	char* p = NULL;
	int loc;

	printf("%s의 주소 : %u\n", str1, str1);
	printf("%s의 주소 : %u\n", str2, str2);
	
	p = strstr(str2, str1); // str2에서 str1이 발견된 시작 주소를 저장
	loc = (int)(p - str2); 
	printf("%s에서 %s의 첫번째 문자가 %d번째에서 발견됨\n", str2, str1, loc);

	return 0;
}

 

 

 

 

int strcmp(const char *str1, const char *str2);

- 기능: 두 문자열 비교
- 인수: 비교할 첫 번째 문자열, 비교할 두 번째 문자열
- 반환값: str1 < str2 음수, str1 > str2 양수, 같으면 0 (사전적 순서)

int strncmp(const char *str1, const char *str2, size_t n);

- 기능: 두 문자열을 처음부터 n바이트까지 비교
- 인수: 첫번째 문자열, 두번째 문자열, 바이트수
- 반환값: n바이트까지 str1 < str2 음수, str1 > str2 양수, 같으면 0 (사전적 순서)

 

 

 

char *strcpy_s(char *dest, rsize_t destsz, const char *src);

- 기능: 문자열을 복사
- 인수: 복사 받을 배열 주소, 복사받을 문자열의 최대(제한) 길이, 복사할 문자열 주소
- 반환값: 복사 받을 배열 주소

char *strncpy_s(char *dest, rsize_t destsz, const char *src, size_t n);

-기능: 문자열에서 n개의 문자 복사
- 인수: 복사 받을 배열 주소, 복사받을 문자열의 최대(제한) 길이, 복사할 문자열 주소, 바이트 수
- 반환값: 복사 받을 배열 주소

 

char *strtok_s(char *str1, const char *delimeter, char **context);

- 기능: 구분자 delimeter을 기준으로 str1 문자열을 토큰(token)으로 분리한다. 
- 인수: 분리할 대상 문자열, 구분자 문자열, 분리된 문자열 중 두번째 문자열의 시작 주소를 저장할 포인터 변수의 주소
- 반환값: 분리한 토큰의 포인터, 토큰 분리가 끝나면 NULL

 

분리하고자 하는 대상 문자열에서 구분자 delimeter 에 저장되어 있는 문자가 나오면,

구분자의 문자를 NULL 값으로 바꾸어 이전 문자열을 하나의 토큰으로 분리한 뒤,

분리된 문자열 중 두번째(다음) 문자열의 주소를 인수로 전달하는 함수이다.

while 반복문을 이용해 문자열의 끝에 도달할 때 까지(구한 token 값이 NULL일 때까지) 토큰을 분리할 수 있다.

 

#include <stdio.h>
#include <string.h>

int main(void) {
	
	char s[] = "I love you so much.";
	char* tok = NULL, * next = NULL;
	char seps[] = " .,[]{}\n"; // separator=delimeter
	int n = 0;

	tok = strtok_s(s, seps, &next);
	while (tok) {
		printf("%d : %s\n", ++n, tok);
		tok = strtok_s(NULL, seps, &next);
	}

	return 0;
}

 

구분자 문자열에 해당되는 모든 문자를 기준으로 토큰이 분리가 된다.

 

 

 

 

char *strcat_s(char *dest, rsize_t destsz, const char *src);

- 기능: 구분자 delimeter을 기준으로 str1 문자열을 토큰(token)으로 분리한다. 
- 인수: 분리할 대상 문자열, 구분자 문자열, 분리된 문자열 중 두번째 문자열의 시작 주소를 저장할 포인터 변수의 주소
- 반환값: 분리한 토큰의 포인터, 토큰 분리가 끝나면 NULL

 

첫 번째 문자열(목적지)의 메모리 공간이 충분히 확보되어야 함을 유의하자.

 

#include <stdio.h>
#include <string.h>

int main(void) {
	
	char dst[30] = "Hi"; 
	char src[] = "Programmers!";
	char str[50] = ""; // 직접 입력받을 문자열 변수 선언

	printf("문자열 입력: ");
	gets(str);

	printf("dst = %s\n", dst);

	strcat_s(dst, sizeof(dst), ", ");
	strcat_s(dst, sizeof(dst), src, 5);
	strncat_s(dst, sizeof(dst), str, 10);

	printf("dst = %s\n", dst);

	return 0;
}

 

메모리 공간이 충분히 확보된 첫번째 문자열 dst에 문자열을 여러 방법으로 이어 붙이는 프로그램이다.

 

 

strncat_s() 함수를 사용한 경우 n의 길이만큼의 문자열이 이어 붙여졌음을 확인할 수 있다.

 

 

 

728x90
반응형
Comments