문자와 문자열

컴퓨터에서 다루는 글자 하나하나를 문자 (Character)라고 합니다.

문자열 (String)은 문자들의 집합으로, 문자의 배열을 칭합니다.

보통 문자를 표현하기 위해서는 따옴표('')를 활용하고, 문자열은 쌍 따옴표("")를 활용합니다.

문자 - 단일 문자

문자열 둘 이상의 문자


Character type

char ch = 'a';

글자를 저장하기 위한 데이터 타입 입니다.

글자를 저장하기 때문에, 따옴표('')로 저장할 글자 하나를 감싸 초기화해야 합니다.


한글자 이상 입력시 에러 char데이터 타입은 한 글자만 저장이 가능합니다.

char x = 'abc'; // error

abc는 따옴표로 묶여 있어 문자라 착각할 수 있지만, 3글자로 쌍따옴표로 묶는것이 올바른 표현 입니다.

char num = '10';

10은 1과 0을 합친 문자열 입니다.

10을 표현하기 위해서는 '1''0'을 활용해야 합니다.


아스키코드 (ASCII code)

컴퓨터는 문자를 문자로 기억하지 않습니다.

문자를 저장하기 위해 숫자를 기억하고, 숫자를 정해놓은 글자로 대응하는 값을 표현하는 방식입니다.

아스키코드ASCII (American Standard Code for Information Interchange)는 0 ~ 127까지의 대응되는 값을 표현할 수 있는 표준 코드 체계 입니다.

ASCII

출처 - https://developer-p.tistory.com/72

char c = 3;

char c = '3';
for(int i = 66 ; i < 72 ; i++) {
		printf("%c", i);
}

아스키코드를 활용하면 알파벳과 관련한 코드를 유연하게 작성할 수 있습니다.

아스키코드는 대문자(65 ~ 90) - 소문자(97 ~ 122)순으로 되어있습니다.

예제

char scan;
scanf("%c", &scan);

if (scan > 'a') {
  scan -= 'a';
}

printf("%c\n", scan);

문자를 입력했을때, 대문자로 변경하여 출력하는 예제입니다. 컴퓨터도 문자 자체를 숫자로 인식하기 때문에, 연산이 가능합니다.


문자열

char str[] = "abcd";

다른 프로그래밍 언어와는 다르게, c언어는 기본적으로 String데이터 타입을 지원하지 않습니다.

때문에, 문자열을 표현하기 위해 char의 배열로 저장합니다.

배열의 마지막 인덱스에 ‘\0’(null)이 자동으로 저장된다

문자열을 다룰때 주의할 점입니다.

자동적으로 문자열의 끝에 '\0'문자가 들어가고, 컴퓨터가 이 문자를 인식해야 문자열의 끝을 알 수 있습니다.

때문에, 널 문자 뒤에 문자열이 있어도 컴퓨터는 인식하지 않습니다.


문자열의 배열

char str[2][10] = {"abc", "def"};

문자열이 문자의 배열이기 때문에, 2차 배열로 문자열의 배열을 활용할 수 있습니다.


string.h의 함수

#include<stdio.h>
#include<string.h>

int main(){
  ...
  return 0;
}

include<string.h> 헤더파일을 활용하면 문자열에 관련된 많은 함수를 활용할 수 있습니다.

strcpy(s1, s2); // s1 = s2

s1 문자열을 s2의 문자열로 초기화하는 함수입니다.

이후 공부할 포인터 관련 개념이지만, 배열을 주소를 변경할 수 없기 때문에, 위 함수를 활용하여 초기화 할 수 있습니다.


strcat(s1, s2); // s1 += s2

s1문자열 뒤에 s2문자열을 추가하는 함수입니다.


strlen(s1); // 문자열의 길이 (null 문자 제외)

int length = strlen(s1);

문자열의 길이를 알려주는 함수입니다. 함수의 return방식에 대하여는 이후에 설명하겠지만, 변수처럼 활용할 수 있다고 알고 있으시면 되겠습니다.


strcmp(s1, s2); // (s1 == s2)

문자열을 비교하는 함수 입니다.

이 함수는 상황에 따라 3가지를 반환(return) 합니다.

> == 0  s1과 s2의 내용이 동일한 string
> >  0    /* s1 > s2  
> <  0    /* s1 < s2


이 함수 이외에도 string.h에는 활용할 수 있는 많은 함수가 있습니다.

더 다양한 함수는 여기에서 확인할 수 있습니다.


문자열 입력

char str[100];

scanf("%s", str);

표준 입출력에서 입력을 위해서 &기호를 변수 앞에 작성했어야 했습니다.

하지만, 문자열은 배열이기 때문에 변수 자체가 해당 주소를 표시하고 있기 때문에, &기호를 입력할 필요가 없습니다.


char value[100];

gets(value); // 마지막 \n를 \0으로 대체

fgets(value, size, stdin); // 마지막 \n를 유지

표준 입출력인 scanf와 다르게, 긴 문자열을 입력받을때 편리한 입력방식입니다.

엔터를 입력하면 문자열에 자동으로 ‘\n’문자가 저장됩니다.

gets함수는 널문자로 이를 대체합니다.

fgets함수는 이 엔터를 유지합니다.



💡 지적 환영합니다

Comments