[CS_study] 문자열

나라리야·2021년 4월 29일
0

CS_study

목록 보기
11/18
post-thumbnail

문자열

문자열의 개념

문자열은 말 그대로 문자들의 배열을 말한다.
문자열은 컴퓨터 메모리 구조상에서 마지막에 널(NULL)값을 포함한다.
널(NULL)값은 문자열의 끝을 알리는 목적으로 사용됩니다.
printf()함수를 실행하면 컴퓨터는 내부적으로 NULL을 만날 때까지 한글자씩 출력한다.



문자열과 포인터

문자열 형태로 포인터를 사용하면 포인터에 특정한 문자열의 주소를 넣게 됩니다.
아래 예시 코드는 "Hello World" 문자열을 읽기 전용으로 메모리 공간에 넣은 뒤에 그 위치를 처리하는 코드입니다.
이러한 문자열을 '문자열 리터럴'(큰 따옴표 안에 문자가 들어가는 것)이라고 하는ㄴ데, 이는 컴파일러가 알아서 메모리 주소를 결정하게됩니다.
그리고 그 주소를 포인터가 가지게 됩니다.

예제)

#include <stdio.h>

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

예제) 포인터를 문자열로 선언했다고 하더라도 기존의 배열처럼 처리할 수 있다.

#include <stdio.h>

int main(void) {
char *a = "Hello World"; 
printf("%c\n", a[1]); 
printf("%c\n", a[4]); 
printf("%c\n", a[8]); 
system("pause");
return 0;   //순서대로 e o r이 출력된다. 
}

문자열 인덱스에 접근해서 문자 하나씩 출력할 수 도 있다.

문자열 입출력 함수

문자열 입출력 함수를 수행할 때 scanf()함수는 공백을 만날 때 까지 입력 받지만
gets()함수는 공백까지 포함하여 한줄을 입력 받는다

#define _CRT_SECURE_NO_WARNINGS //사용사로부터 입력을 받겠다
#include <stdio.h>

int main(void) { 
char a[100]; 
gets(a); 
printf("%s\n", a); 
system("pause"); 
return 0;
}  // Hello World를 입력하더라도 Hello World 공백이 포함된 문자열 자체가 보여진다.

gets()함수는 버퍼의 크기를 벗어나도 입력을 받아버린다. 보안상의 취약점이 있어 문제가 있지만 단순하게 현재 문자열에 대한 공부를 할 때는 gets()함수를 공부하는게 이해가 쉬워진다고한다.
현재 실무에서는 C11 표준부터는 버퍼의 크기를 철저히 지키는 gets_s() 함수가 추가되어 실제 사용되고 있다고 한다. (gets_s()함수는 특정한 범위 만큼만 정확히 문자를 입력받도록 만든 다는 점에서 다소 안정적으로 사용되고 있는 함수라고 할 수 있다고 함 )

간단한 gets_s()함수예제

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
char a[100]; 
gets_s(a, sizeof(a));  //sizeof()함수로 문자열의 크기를 정할 수 있다. 
printf("%s\n", a); 
system("pause"); 
return 0;
}

// 만약 100자 이상의 문자를 입력받은경우 오류가 나면서 실행되지않는다. 

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

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

추후 C++을 이용할 때는 더 간편하고 다양한 함수를 사용할 수 있는데, C언어에서의 문자열 함수는 <string.h> 라이브러리에 포함되어 있습니다.



strlen()는 문자열의 길이를 반환합니다.
strcmp()는 문자열 1이 문자열 2보다 사전적으로 앞에 있으면 -1, 뒤에 있으면 1을 반환합니다.
strcpy()는 문자열을 복사합니다.
C언어에서는 기본적으로 ‘a = b’와 같은 간단한 방식으로는 문자열 복사가 안 됩니다.
strcat()은 뒤에 있는 문자열을 앞에 있는 문자열에 합칩니다.
strstr()은 긴 문자열에서 짧은 문자열을 찾아 그 위치를 반환합니다.
짧은 문자열을 찾은 주소값 자체를 반환하므로 단순히 출력하도록 하면,찾은 이 후 모든 문자열이 반환됩니다.

오늘의 정리!

1) C언어에서 문자열은 배열이므로 포인터 형태로 사용할 수 있습니다.
2) C언어에서 문자열 비교, 연산, 탐색 등의 알고리즘의 사용 방법은 각각 함수 형태로 제공됩니다.

profile
Code의 美를 추구하는 개발자 🪞

0개의 댓글