C언어

문자열

khon98 2020. 12. 5. 13:34

문자열의 개념

- 문자열은 말 그대로 문자들의 배열

- 문자열은 컴퓨터 메모리 구조상에서 마지막에 널(null) 값을 포함

- 널(null) 값은 문자열의 끝을 알리는 목적으로 사용됨

- printf( ) 함수를 실행하면 컴퓨터는 내부적으로 null을 만날 때까지 출력함

 

null : 존재하지 않는다라는 뜻

 

0 1 2 3 4 5 6  7 8 9 10 11

H E L L O   W O R L D  \0(null값)

 

문자열과 포인터

- 문자열 형태로 포인터를 사용하면 포인터에 특정한 문자열의 주소를 넣게 됨

- 다음 코드는 "Hello World" 문자열을 읽기 전용으로 메모리 공간에 넣은 뒤에 그 위치를 처리함

- 이러한 문자열을 '문자열 리터럴'이라고 말함 이는 컴파일러가 알아서 메모리 주소를 결정함

 

#include<stdio.h>
#include<cstdlib>

int main(void) {
	char *a = "Hello World"; // 오류 발생
	printf("%s\n", a);
	system("pause");
	return 0;
}
#include<stdio.h>
#include<cstdlib>

int main(void) {
	const char *a = "Hello World";
	printf("%s\n", a);
	system("pause");
	return 0;
}

"const char *" 형식의 값을 사용하여 "char *" 형식의 엔터티를 초기화할 수 없습니다. 이 오류가 뜨면

char 앞에 const를 붙이면 됨

 

- 포인터로 문자열을 선언했다고 하더라도 기존의 배열처럼 처리할 수 있음

#include<stdio.h>
#include<cstdlib>

int main(void) {
	const char *a = "Hello World";
	printf("%c\n", a[1]);
	printf("%c\n", a[4]);
	printf("%c\n", a[8]);
	system("pause");
	return 0;
}

 

 

문자열 입출력 함수

- 문자열 입출력을 수행

- scanf( ) 함수는 공백을 만날 때까지 입력받지만 gets( ) 함수는 공백까지 포함하여 한 줄을 입력 받음

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<cstdlib>

int main(void) {
	char a[100];
	gets(a); // 오류 발생
	printf("%s\n", a);
	system("pause");
	return 0;
}

- gets 함수는 버퍼의 크기를 벗어나도 입력을 받아버림

 

- C11 표준부터는 버퍼의 크기를 철저히 지키는 gets_s( ) 함수가 추가됨

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<cstdlib>

int main(void) {
	char a[100];
	gets_s(a, sizeof(a));
	printf("%s\n", a);
	system("pause");
	return 0;
}

- gets_s( )를 이용하는 경우 범위를 넘으면 그 즉시 런타임(Runtime) 오류가 발생하게 됨

 

문자열 처리를 위한 다양한 함수

- C언어의 문자열처리와 관련해서는 기본적인 문자열 함수를 알고 있는 것이 좋음

- 나중에 C++을 이용하면 더욱 간편하고 다양한 함수를 사용할 수 있음

- C언어에서의 문자열 함수는 <string.h> 라이브러리에 포함되어 있음

 

strlen( ) - 문자열의 길이를 반환

strcmp( ) - 문자열 1이 문자열 2보다 사전적으로 앞에 있으면 -1, 뒤에 있으면 1을 반환

strcpy( ) - 문자열을 복사

strcat( ) - 문자열 1에 문자열 2를 더함

strstr( ) - 문자열 1에 문자열 2가 어떻게 포함되어 있는지를 반환

 

* strlen( )

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<cstdlib>
#include<string.h> // 없으면 strlen 오류 발생

int main(void) {
	char a[20] = "khon";
	printf("%d\n", strlen(a));
	system("pause");
	return 0;
}

 

* strcmp( )

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<cstdlib>
#include<string.h> // 없으면 strcmp 오류 발생

int main(void) {
	char a[20] = "khon";
	char b[20] = "khon98";
	printf("두 배열의 사전순 비교: %d\n", strcmp(a, b));
	system("pause");
	return 0;
}

 

* strcpy( )

- C언어에서는 기본적으로 'a = b'와 같은 간단한 방식으로는 문자열 복사가 안됨

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<cstdlib>
#include<string.h> // 없으면 strcpy 오류 발생

int main(void) {
	char a[20] = "My Name";
	char b[20] = "khon";
	strcpy(a, b);
	printf("복사된 문자열: %s", a);
	system("pause");
	return 0;
}

 

* strcat( )

- 뒤에 있는 문자열을 앞에 있는 문자열에 합침

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<cstdlib>
#include<string.h> // 없으면 strcat 오류 발생

int main(void) {
	char a[30] = "My Name is "; // 합쳐지는 배열의 크기가 적지 않도록 해줘야함
	char b[20] = "khon";
	strcat(a, b);
	printf("합쳐진 결과 문자열: %s\n", a);
	system("pause");
	return 0;
}

 

* strstr( )

- 긴 문자열에서 짧은 문자열을 찾아 그 위치를 반환함

- 짧은 문자열을 찾은 주소 값 자체를 반환하므로 단순히 출력하도록 하면 찾은 이후 모든 문자열이 반환됨

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<cstdlib>
#include<string.h> // 없으면 strstr 오류 발생

int main(void) {
	char a[30] = "I like you ";
	char b[20] = "like";
	printf("찾은 문자열: %s\n", strstr(a, b));
	system("pause");
	return 0;
}

 

 

- C언어에서 문자열은 배열이므로 포인터 형태로 사용할 수 있음

- C언어에서 문자열 비교, 연산, 탐색 등의 알고리즘의 사용 방법은 각각 함수 형태로 제공됨