내가 이 글을 쓰는 이유는 코딩테스트에서 문자열 입력 받는걸 까먹어버려 문제를 풀지 못한게 한이 되어 리마인드겸 기록을 위해 작성했다.
틀린 부분이나 피드백이 있다면 댓글로 알려주면 감사하겠다.
문자열에 대해 알아보기 위해선 우선 char(Character)에 대해 알아볼 필요가 있다.
C언어에서 char은 1Byte의 공간을 할당 받으며 문자를 저장하기 위해 사용이 된다. 서식지정자는 %c 이다
근데 말만 문자를 저장하는 공간이지 사실상 1Byte짜리 정수형 변수이다. 근데 이제 문자를 표현하는 능력을 곁들인,,
즉 표면적으로는 문자로 표현되지만 내부에서는 숫자로 처리되어진다는 말이다.
대표적으로 사용되는 예가 아스키 코드가 있다.
영어로는 STRING, 정의는 "문자들을 나열하여 하나로 묶은 대상" 이다.
??? : 어 그러면 문자열을 받을려면 char 자료형인 변수를 사용하면 되겠네?
반은 맞고 반은 틀리다. char형 변수가 문자를 받는건 맞다.
그런데 이 글의 목적은 무엇인가? '문자열'을 받는 것이다.
아래의 코드를 살펴보자
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
char a; //char형 a라는 변수 생성
scanf("%c", &a); //INPUT
printf("%c", a); //OUTPUT
}
이 코드에서 만약 "abc" 라고 넣으면 어떻게 출력이 될까?
아마 아래와 같이 출력 될 것이다.
INPUT : abc
OUTPUT : a
왜냐? char형 변수는 '문자'를 저장하니까.
??? : 그러면 '문자열'은 어떻게 입력 받는데?
간단하다 그냥 char형 배열을 만들어 주고 서식지정자를 %s로 바꾸어 주면 된다.
아래의 코드를 살펴보자
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
char a[10]; //a라는 10개의 char 변수를 저장할 수 있는 배열 생성
scanf("%s", a); //INPUT
printf("%s", a); //OUTPUT
}
위 코드에서 'abc'를 넣어보면?
INPUT : abc
OUTPUT : abc
입력 받은 'abc'가 정상적으로 출력이 된다!
다만 scanf("%s", (배열 명)); 은 첫번 째 공백을 기준으로 나누기 때문에 이 점을 유의 해야한다. 예를 들어 'Hello world'를 입력하면 'Hello' 만 들어간다.
만약 띄어쓰기도 포함하고 싶으면 아래의 함수를 사용하자
fgets(배열명,길이(5글자 입력받고 싶으면 6으로),stdin);
공백 포함 입력 가능 ⇒ 줄바꿈 포함,문자열 끝에 자동으로 NULL 문자 추가됨
근데 길이가 배열의 크기를 넘어가면 어떻게 될까?
-> 배열의 크기를 넘어버리면 배열의 공간을 넘어서서 다른 메모리를 침범 할 수 있으니 조심하자
(버퍼 오버플로우)
가능하면 그냥 fgets(배열명,sizeof(배열명),stdin); 이렇게 쓰자.
결론은 문자열을 입력 받기 위해서는 char형 배열을 만들고 서식지정자를 %s로 바꿔주면 된다!
문자열을 입력받고 난 뒤에서는 '\0' (NULL 문자)가 항상 마지막 공간에 추가된다. 그러므로 내가 a라는 배열에 'abc'를 저장하고 싶다면 배열을 선언 할때
char a['들어가는 문자의 갯수 + 1']; 즉 char a[4]; 이런 식으로 선언을 해줘야 한다. 저렇게 선언 하지 않는 다면 에러가 뜬다.
그러므로 이 NULL 문자는 문자열의 끝을 알리고 구분할 수 있게 해주는 매우 중요한 친구이다.
+추가로 string.h 함수를 이용해 문자열의 길이를 strlen("배열 명")을 이용해 쉽게 구하는 등, 문자열을 사용하는데 여러 편한 기능들을 제공한다.
아래는 string.h에 있는 함수 목록이다.
strlen(배열명) → 문자열길이
strcpy(배열명 a, b) → b를 a에 복사
strcat(a,b) → b를 a에 이어 붙임 a의 길이가 커야함
strcmp(a,b) → 문자열 비교(같으면 0,틀리면 틀린 문자 - 틀린 문자)
예 oranges orange → s - \0 = 115 반환
char a[10] = "hyun";
이렇게 초기화를 한 후에
a = "abcd";는 안됨 이럴 경우 strcpy를 통해 수정해야함
오늘은 이렇게 문자열에 대해 알아봤다. 아스키 코드에 대해선 나중에 하고 싶을 때 추가로 작성 하겠다.