[C] 문자열, 너 도대체 누구니?

권길현·2024년 11월 20일
2

C

목록 보기
1/2
post-thumbnail

✋ 들어가기전

내가 이 글을 쓰는 이유는 코딩테스트에서 문자열 입력 받는걸 까먹어버려 문제를 풀지 못한게 한이 되어 리마인드겸 기록을 위해 작성했다.
틀린 부분이나 피드백이 있다면 댓글로 알려주면 감사하겠다.

🤔 char 자료형?

문자열에 대해 알아보기 위해선 우선 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로 바꿔주면 된다!

‼️ 이제 문자열을 이용하면서 중요한 NULL 문자에 대해 알아보자

문자열을 입력받고 난 뒤에서는 '\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를 통해 수정해야함

마치며,,

오늘은 이렇게 문자열에 대해 알아봤다. 아스키 코드에 대해선 나중에 하고 싶을 때 추가로 작성 하겠다.

profile
하고 싶은거 하면서 삽시다.

0개의 댓글