문자열
문자열의 개념
- 문자열은 말 그대로 문자들의 배열
- 문자열은 컴퓨터 메모리 구조상에서 마지막에 널(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언어에서 문자열 비교, 연산, 탐색 등의 알고리즘의 사용 방법은 각각 함수 형태로 제공됨