자료실/C언어

C언어 - 문자열

자료수집중 2020. 6. 29.
반응형

C언어에서 문자열은 문자의 배열로 저장합니다.

 

문자열의 표현은 "" 큰따옴표로 합니다. 

char st[11] = "안녕하세요";

문자의 배열이기 때문에 문자 하나씩 저장할 수 있습니다.

char st[5] = { 'a', 'b', 'c', 'd', '\0'};

여기서 한가지 중요한 건 한글은 한 글자에 2byte씩 차지합니다.

"안녕하세요"는 5글자로 5X2=10 을 차지합니다.

하지만 배열의 크기를 11로 선언했습니다.

위에서도 보면 문자열은 저장할때 마지막에 NULL(\0)을 붙여야 합니다.

하지만 저장하는 문자열보다 크게 배열의 크기를 선언하면 자동으로 NULL(\0)이 채워지기때문에 저장할 문자열보다 배열을 크기 선언하면 됩니다.

 

만약 필요한 문자열이 얼마 큼의 배열의 크기를 해야 할지 모른다면

char st[] = "Hello World";

배열의 크기를 생략하고 문자열을 대입하면 해당 문자열 크기만큼 배열의 크기가 정해집니다.

 

문자열의 길이를 알아보면 한글의 차이가 더 확실히 보입니다.

*string.h는 표준 라이브러리로 문자열을 다룰때 사용하는 함수들을 포함하고 있습니다.

 

strlen()은 문자열의 길이를 알려줍니다. 단 NULL(\0)을 만날때까지의 길이를 측정합니다.

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


int main(void) {

	char st[11] = "안녕하세요";
	char st2[5] = { 'a', 'b', 'c', 'd', '\0' };
	printf("%s 의 길이 = %d \n", st, strlen(st));
	printf("%s 의 길이 = %d \n", st2, strlen(st2));

	return 0;
}

문자열 중간에 NULL(\0)을 입력하면 NULL(\0)까지의 길이만 측정합니다.

char st2[5] = { 'a', 'b', '\0', 'd', '\0' };

"안녕하세요"의 길이도 살펴보면 10으로 나옵니다. 한글은 한 글자에 2byte씩 차지하기 때문입니다.

 

 

문자열은 선언과 동시에 초기화해주지 않으면 중간에는 일반적인 대입은 에러가 발생합니다.

// 에러 발생
int main(void) {

	char st[11];
	st = "안녕하세요";  //
	return 0;
}

그래서 strcpy()를 사용해서 문자열을 복사 대입합니다.

int main(void) {

	char st[11];
	strcpy(st, "안녕하세요");
	return 0;
}

 

다음으로 문자열을 비교하는 함수에 대해서 알아보겠습니다.

먼저 strcmp()입니다.

int main(void) {

	char st[5] = "bbbb";
	char st2[5] = "aaaa";
	char st3[5] = "bbbb";
	char st4[10] = "cccccccc";
	char st5[10] = "bbbbaccc";
	printf("%s 와 %s 비교 = %d \n", st, st2, strcmp(st,st2));
	printf("%s 와 %s 비교 = %d \n", st, st3, strcmp(st, st3));
	printf("%s 와 %s 비교 = %d \n", st, st4, strcmp(st, st4));
	printf("%s 와 %s 비교 = %d \n", st, st4, strcmp(st, st5));
	return 0;
}

strcmp(문자열1, 문자열2)로 문자열1과 문자열2가 완벽하게 같으면 0, 문자열1이 문자열2보다 크면 1,문자열1이 문자열2보다 작으면 -1을 반환합니다.

비교는 ASCII(아스키 코드)를 기준으로 비교합니다. 

문자열을 앞에서부터 검사하면서 크기가 다른 문자가 나오면 값을 반환하는 방식입니다.

"bbbbbfff" 와 "bbbbdaaa"를 비교해도 5번째 문자에서 값의 차이가 나기 때문에 뒷부분은 검사하지 않고 바로 -1을 반환합니다.

그래서 보통은 같은지를 검사할 때 많이 사용합니다.

문자열은  == 연산자가 같은지 다른지를 판단하지 못합니다. 그때 strcmp()을 많이 사용합니다.

if (strcmp(st, st2)==0) 
    printf("문자열이 같음");
else 
    printf("문자열이 같지 않음");

 

strcnmp()strncmp(문자열1, 문자열2, n)의 형식으로 문자열의 n번째 문자까지만 검사합니다.

int main(void) {

	char st[5] = "bbbb";
	char st1[10] = "bbbbdaaa";
	printf("%s 와 %s 비교 = %d \n", st, st1, strcmp(st, st1));
	printf("%s 와 %s 비교 = %d \n", st, st1, strncmp(st, st1, 4));

	return 0;
}

strcmp()은 다르다는 결과가 나오지만 strcnmp()은 같다는 결과가 나옵니다.

4번째 문자까지 검사해보면 "bbbb"로 같기 때문에 0을 반환합니다.

 

문자열과 문자열을 연결할 수도 있습니다.

strcat(문자열1, 문자열2);  문자열1에 문자열2를 이어서 연결합니다.

int main(void) {

    char st[30] = "안녕하세요 ";
    char st1[12] = "hello world";
    strcat(st, st1);
    printf("%s \n", st );

    return 0;
}

문자열1에 저장되기 때문에 충분한 배열의 크기를 선언해야 합니다.(크기를 초과하면 에러 발생)

 

문자열에서 특정 문자가 있는지를 검사할 수 있습니다.

strchr(문자열, 문자);  문자열에서 해당 문자를 검색합니다.

만약 해당 문자가 있다면 검색된 문자부터 다음의 문자열을 반환합니다. 없다면 NULL을 반환합니다.

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


int main(void) {

    char st[12] = "Hello World";
    printf("%s \n", strchr(st, 'W'));

    return 0;
}

'W'를 검색해서 W부터 문자열이 반환된 결과를 볼 수 있습니다.

 

 

문자열에서 특정 문자열이 있는지도 검사가 가능합니다.

strstr(문자열1, 문자열2);  문자열1에 문자열2가 있는지 검사합니다.

만약 있다면 찾은 문자열부터 반환합니다.

int main(void) {

    char st[12] = "Hello World";
    printf("%s \n", strstr(st, "lo"));

    return 0;
}

찾는 문자열이 없다면 NULL을 반환합니다.

 

특정 문자를 기준으로 문자열을 조각 내주는 함수도 있습니다.

strtok(문자열, 문자); 문자열에서 해당 문자가 있는 부분부터 뒷부분을 버리고 나머지를 반환합니다.

여기서 문자가 중요합니다. ''가 아니라 ""입니다.(토큰

대신 특정 문자를 여러 개 입력할 수 있습니다. ex "oes" 면 o, e, s 중 먼저 찾는 게 반환됩니다.

int main(void) {

    char st[] = "hello world";
    printf("%s \n", strtok(st, " "));

    return 0;
}

strtok()는 포인터를 반환하기 때문에 주의에서 사용해야 합니다.

 

 

'자료실 > C언어' 카테고리의 다른 글

C언어 - 문자,문자열의 입력, 출력  (0) 2020.06.30
C언어 - 문자열과 포인터  (0) 2020.06.29
C언어 - 구조체  (0) 2020.06.27
C언어 - 배열  (0) 2020.06.23
C언어 - 변수의 생존기간과 저장 유형 지정자  (0) 2020.06.22

댓글