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(배열명, "문자열");
물론 배열의 개수를 초과해서는 안되고 개행문자도 생각을 해야합니다.
배열 x
에 BBBBBB
가 들어있는데 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를 출력합니다.
}
결과
배열 y
의 BBBBBB
가 배열 x
의 AAA
로 교체되었습니다. 복사될 장소의 배열 크기가 더 크거나 같으면 상관없지만 더 작으면 오류가 발생합니다.
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);
}
결과
배열 x
의 BBBBBB
중 앞 세 자리만 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()