C언어 문자열 처리 함수의 복사, 연결 등의 예제

C언어 문자열 처리 함수는 헤더에 #include<string.h>를 삽입해야 사용할 수 있습니다. 문자열 복사, 연결, 정렬, 측정 등에 따라 함수 종류가 달라집니다.

C언어 문자열 처리 함수 종류

함수 기능
#include <string.h> 문자열 함수 파일 호출
strcpy(), strncpy() 문자열 복사
strcat() 문자열 연결
strrev() 문자열 역순 정렬
strlwr(), strupr() 문자열 대소문자 변환
strlen() 문자열 문자 개수 측정
strcmp(), stricmp() 문자열 개수 비교

문자열 처리 함수 헤더 <string.h>

문자열 처리 함수를 사용하려면 헤더 영역에 #include <string.h> 를 추가해줘야합니다.

문자열 전체 복사 및 삽입 strcpy()

특정 문자열에 문자열을 단순 삽입하는 방법은 strcpy() 함수에 값을 직접 입력하면 됩니다.

strcpy(배열명, "문자열");

물론 배열의 개수를 초과해서는 안되고 개행문자도 생각을 해야합니다.

배열 xBBBBBB가 들어있는데 AAA 문자열로 교체하고 싶은 경우 단순 삽입하는 예제입니다.

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

int main()
{
	char x[20] = "BBBBBB";

	strcpy(x, "AAA"); //배열 x의 값을 문자열 AAA로 교체합니다.

	puts(x);
}

결과

AAA

배열에서 배열로 복사할 경우, 문자열 대신 배열 이름을 적어주면 됩니다.

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

int main()
{
	char x[20] = "AAA";
	char y[20] = "BBBBBB";

	strcpy(y, x); //배열 y에 배열 x에 들어있는 전체 값을 대입합니다.

	puts(y); //배열 y를 출력합니다.
}

결과

배열 yBBBBBB가 배열 xAAA로 교체되었습니다. 복사될 장소의 배열 크기가 더 크거나 같으면 상관없지만 더 작으면 오류가 발생합니다.

AAA

문자열 부분 복사 및 삽입 strncpy()

문자열 배열에 특정 부분만 복사할 경우 strncpy() 함수를 사용합니다.

strncpy(배열명, "문자열", 옮길개수);

strcpy() 함수와 차이점은 원하는 개수 만큼만 복사되고 나머지 배열값은 유지된다는 점입니다.

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

int main()
{
	char x[20] = "BBBBBB";

	strncpy(x, "AAAAAA", 3); //문자열 AAAAAA중에서 앞자리 3요소 AAA만 배열 x에 삽입합니다.

	puts(x);
}

결과

배열 xBBBBBB중 앞 세 자리만 AAA로 대체되고, 나머지 BBB 요소는 유지됩니다.

결과

AAABBB

마찬가지로 배열과 배열간의 이동에서도 원하는 개수만큼 이동되며 잔여 배열값은 유지됩니다.

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

int main()
{
	char x[20] = "AAAAAA";
	char y[20] = "BBBBBB";

	strncpy(y, x, 3); //배열 x의 앞자리 세 문자를 배열 y의 앞자리 3자리에 삽입합니다.

	puts(y); //배열 y 출력
}

결과

AAABBB

문자열 연결 strcat()

문자열 배열에 다른 문자열을 뒤이어 결합할 경우 strcat() 함수를 사용합니다. 문자열 배열에 문자열을 직접 삽입하는 예제입니다.

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

int main()
{
	char x[50] = "AAAAAA";

	strcat(x, "BBBBBB"); //배열 x의 뒤에 문자열 BBBBBB 삽입

	puts(x); //배열 x 출력
}

결과

AAAAAABBBBBB

배열에 다른 배열값을 이어 붙인 예제입니다.

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

int main()
{
	char x[50] = "AAAAAA";
	char y[10] = "BBBBBB";

	strcat(x, y);

	puts(x); //배열 x 출력
}

결과

AAAAAABBBBBB

문자열 역순 정렬 strrev()

문자열 배열을 역순(reverse)으로 정렬할 때에는 strrev() 함수를 사용합니다.

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

int main()
{
	char x[50] = "ABCDEFG";

	puts(strrev(x)); //배열 x의 값을 뒤집어(strrev) 출력(puts)합니다.
}

결과

컴파일 오류가 발생할 경우 _strrev()로 앞에 언더바(_)를 붙이면 됩니다.

GFEDCBA

문자열 대소문자 변환 strlwr(), strupr()

문자열 배열에서 대문자를 소문자로 변환할 때에는 strlwr() 함수를 사용합니다. 소문자를 대문자로 변경할 때에는 strupr() 함수를 사용합니다.

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

int main()
{
	char x[50] = "ABCDEFG";
	char y[50] = "abcdefg";

	puts(_strlwr(x)); //배열 x의 값을 소문자(strlwr)로 출력(puts)합니다.

	puts(_strupr(y)); //배열 y의 값을 대문자(strupr)로 출력(puts)합니다.
}

결과

abcdefg
ABCDEFG

문자열 길이 측정 strlen()

문자열 배열에서 NULL 문자를 제외한 실제 문자 개수를 구할 때는 strlen() 함수를 사용합니다. 반면, 전체 배열의 크기를 구할 때는 sizeof() 함수를 사용합니다.

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

int main()
{
	char x[50] = "qskdjfklaslkdfjaskdfsdfskdjfklsdjklf";

	int y;
	int z;

	y = strlen(x); //배열에서 NULL 문자 제외 문자 개수
	z = sizeof(x); //배열 전체 크기

	printf("배열 x의 문자 개수는 %d 입니다. \n", y);
	printf("배열 x의 크기는 %d 입니다. \n", z);
}

결과

배열 x의 문자 개수는 36 입니다.
배열 x의 크기는 50 입니다.

문자열 비교 strcmp(), stricmp()

문자열 비교에는 strcmp()를 사용하고, 대소문자 구분을 하지 않을 경우 stricmp()를 사용합니다.

strcmp(a, b)함수에서 a > b이면 -1, a = b이면 0, a < b,이면 1을 반환합니다.

문자열의 대소를 비교하는 이유는 MS EXCEL에서 같은 문자 찾기 기능을 생각해보면 그 쓰임새를 예상해볼 수 있습니다.

문자열의 대소의 기준은 문자는 사실 아스키 코드라는 숫자로 이루어졌기 때문에 비교가 가능합니다.

아스키 코드
십진수 상징
65 A
66 B
67 C
97 a
98 b
99 c

예를 들어 대문자 A는 아스키 코드상에서 숫자 65이고, 소문자 a는 숫자 97입니다. 따라서 숫자로 비교를 하면 대문자 A는 소문자 a보다 작습니다.

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

int main()
{
	char x[50] = "A";
	char y[50] = "a";

	int z;

	z = strcmp(x, y);

	printf("%d", z);

}

결과

A는 숫자 65이고, a는 숫자 97이므로 A가 더 작습니다. 그래서 음수로 나옵니다.

-1

문자열의 개수가 서로 다르거나 섞여 있을 경우 첫 자리 문자부터 비교를 합니다. 첫 번째 자리의 문자로 대소가 결정되며 동률이면 두 번째를 기비교하는 식으로 내려갑니다.

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

int main()
{
	char x[50] = "ab";
	char y[50] = "aABCDE";

	int z;

	z = strcmp(x, y);

	printf("%d", z);

}

결과

자릿수가 아무리 길어도 첫 번째 자릿수부터 비교를 합니다.

1

stricmp() 함수를 사용하면, 대소문자 구분을 하지 않습니다.

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

int main()
{
	char x[50] = "A";
	char y[50] = "a";

	int z;

	z = _stricmp(x, y);

	printf("%d", z);

}

결과

0

대소문자 구분을 하지 않으므로 서로 같아서 0을 반환합니다. 컴파일 오류가 발생하면 앞에 언더바(_)를 삽입해줍니다. _stricmp()