본문 바로가기

BackEnd/C

배열을 이용한 문자열의 표현

반응형

문자열은 상수와 변수 형태로 표현이 가능하다.


그런데 변수 형태의 문자열은 배열을 기반으로 해서 선언한다. 


이번에는 배열을 이용해서 변수 형태의 문자열을 어떻게 선언하는지 핵심적으로 봐볼건데


그전에 앞서 먼저 상수에 대해 다시 봐보자.



1. 상수의 공통적 특징?


특징은 메모리 공간에 자동으로 할당이 이루어 진다는 것이다.


C언어에서의 상수는 다음과 같이 총4가지로 구분된다.



예를 들어 int n = 10 + 20; 이라는 문장이 있을때, 변수 n을 위해서도 메모리 공간의 할당이 이뤄지지만,


상수 10과 20을 위해서도 할당이 이뤄진다. 이는 문자열 상수 및 나머지 모두 마찬가지이다. 


2. printf 함수 호출 문의 문자열 상수


printf 함수에 표현되는 문자열(문자열 상수)도 메모리 공간에 할당된다.




문자열이 메모리 공간에 저장된 후 문자열이 선언된 위치로 저장된 메모리 주소값을 반환한다.



그런데 이 주소값은 사실 문자열의 시작 주소(H의 주소값) 값이다. 그런데 이렇게 시작 주소값만 전


달되는데도 불구하고 printf함수는 문자열만 딱 출력을 한다. 문자열의 마지막 위치를 모르는 상태


에서 저장되어 있는 데이터 값만 가지고는, 문자열 데이터인지 아닌지를 구분할 수 없다. 그래서 이


점을 해결하기 위해 하나의 약속을 한다.


문자열을 저장할 때에는 문자열의 마지막에 null 문자를 저장해서 문자열의 끝을 표시한다.


널 문자는 숫자0을 의미한다. 그리고 문자열 내에서는 \0으로 표시된다. 숫자 0의 아스키코드 문자


가 \0인데, 이를 가리켜 널 문자라 한다. 


다음 예제를 봐보자


 

1
2
3
4
5
6
7
8
9
10
11
int main(void)
{
    printf("AA0BB0CC");
    printf(" | ");
    printf("AA\0BB\0CC");
    printf(" | ");
    printf("\0AA");
    printf(" | ");
 
    return 0;
}



1
AA0BB0CC | AA |  |



5행에 널 문자 \0이 삽입되었다. 


7행에 문자열의 첫문자가 널 문자이다.


3행에 문자열 안에 0이 삽입되었는데 이는 숫자가 아니라 문자이다. 널문자가 아니다.


3행을 보면 다음과 같은 형태로 메모리 공간에 할당이 이뤄지고 출력된다.



그림을 보면 문자열의 마지막 끝에 \0(숫자0)이 자동으로 삽입되었다.


그리고 문자열에 저장된 0은 아스키코드 값이 48인 문자이다. 이는 널 문자가 아니다.


다음 그림은 5행의 메모리 공간 할당과 출력을 봐보자



문자열 중간에 널 문자를 삽입하였다.


널 문자를 만날 때까지만 출력이 진행된다. 그래서 실제 출력된 문자열은 "AA" 이다.



3. 문자열의 출력에 사용되는 서식문자 %s






4. 1차원 char형 배열을 이용한 문자열 표현


문자열의 저장을 위한 기본 자료형은 존재하지 않는다. 그래서 char형 배열을 사용하면 문자열을 저


장할 수 있다. 따라서 c언어에서는 문자열 변수의 선언 방식을 다음과 같은 형태로 정의해 놓았다.




위처럼 배열 str이 바로 문자열 변수가 되는 것이다.


그리고 문자열의 길이는 4지만 배열의 길이는 5로 선언되었다. 이는 자동으로 삽입되는 널 문자


를 고려했기 때문이다. 



다음 문자열 변수의 선언과 활용 예제를 봐보자.


문자열 변수에 저장된 데이터를 일부 변경하는 작업도 진행하는데, 이는 문자열 변수가 말 그대


로 변수라는 사실을 보여준다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main(void)
{
    char str1[5]="ABC";
    char str2[ ]="BBB";
    char str3[ ]={'A''B''C'};
    char str4[ ]={'A''B''C''\0'};
 
    printf("str1: %s \n", str1);
    printf("str2: %s \n", str2);
    printf("str3: %s \n", str3);
    printf("str4: %s \n", str4);
 
    str1[0]='C';
    str1[1]='B';
    printf("str1: %s \n", str1);
 
    return 0;
}

cs

1
2
3
4
5
str1: AAA
str2: BBB
str3: ABC
str4: ABC
str1: CBA
cs

13,14행에서는 문자열의 일부를 변경하고 있다. str1이 문자열 변수임을 확인시켜준다.


6행과 3행은 완전히 동일하다. 문자 A,B,C가 나란히 메모리 공간에 저장되는 것도 동일하고, 널 문


자가 삽입되는 것도 동일하다. 하지만 5행에서는 3행,4행과 같이 널문자가 자동으로 삽입이 되지않


는다. 그냥 char형 배열 선언을 한것이다. 이처럼 문자열의 판단 기준은 널 문자의 존재 여부에 달려


있다. 다만 출력은 10행에서 ABC로 동일하게 나왔는데, 정상적인 출력으로는 볼 수 없다.


5. scanf 함수를 이용한 문자열 입력


문자열 입력을 위해서는 다음 2가지가 필요하다.


- 문자열을 저장할 char형 배열


- 문자열의 입력을 의미하는 서식문자 %s



1
2
3
4
5
6
7
8
9
int main(void)
{
    char str[30];
    printf("문자열 입력:");
    scanf("%s", str);
    printf("입력 받은 문자열: %s \n", str);
 
    return 0;
}

cs


5행에서처럼 scanf 함수 호출시 입력받은 데이터를 저장할 변수의 주소값을 전달해야한다.


5행에서 str은 &연산자를 붙이지 않았다. 왜냐하면 배열의 이름에는 할당된 배열의 시작 주소 정보


가 담겨있기 때문이다.




반응형

'BackEnd > C' 카테고리의 다른 글

2차원 배열과 1차원 배열의 관계  (0) 2019.03.10
2차원 배열의 이해와 적용  (0) 2019.03.10
1차원 배열의 이해와 활용  (0) 2019.03.09
비트 마스크  (0) 2019.03.09
비트 쉬프트(Shift) 연산자  (0) 2019.03.09