티스토리 뷰

728x90

C언어에서는 문자열(String, 스트링) 타입을 지원하지 않습니다. char(signed char) 또는 unsigned char로 정의하는 문자의 배열이나 배열에 대한 포인터가 일반적으로 말하는 스트링이라 할 수 있습니다. 문자형 타입인 char은 1 바이트의 메모리 공간을 차지하는 타입으로 리터럴(상수)은 작은 따옴표(', apostrophe)로 a = 'A';와 같이 표현합니다. 대부분의 영문자, 숫자, 특수문자 등은 32~127 사이의 문자 값으로(아스키, ASCII) 표현 하는데 32 아래의 특수문자들은 눈에 보이지 않는 제어(컨트롤) 문자가 배정되어 있고 대표적인 제어문자로 C에서는 아래와 같이 표현할 수도 있습니다.

  • '\a' : 알람음. 7
  • '\b' : 백스페이스, 8
  • '\f' : 폼피드, 12
  • '\n' : 개행, 10
  • '\r' : 리턴, 13
  • '\t' : 수평탭, 9
  • '\v' : 수직탭, 11

문자값을 8진수로 '\012' 처럼 입력할 수도 있고 16진수로 '\xff'처럼 입력할 수도 있습니다.

중요한 점은 C언어에서는 문자열 타입이 없기 때문에 대입 연산자(=)를 사용해서 astr = bstr; 과 같은 방식으로 문자열 값을 복사할 수도 없고 비교 연산자로 문자열 내용을 비교할 수도 없습니다. 대신에 strcpy, strcmp, strlen과 같은 라이브러리 함수를 사용해서 처리해야 하는데 이들 함수가 인식하는 문자열의 끝은 널문자(0)이기 때문에 널이 없는 문자열을 가지고 라이브러리 함수를 사용하면 프로그램이 오동작하는 등 심각한 상황을 초래할 수 있으므로 주의해야 합니다.

25. 다음 프로그램의 출력 결과는 무엇인가?
    char s[11] = "hell world";
    s[4] = '\0';
    printf("S%sE\n", s);
① ShellE ② Shell worldE ③ Shell E ④ Shell wolE ⑤ hello

위의 문제는 C언어의 문자열 처리 방식을 제대로 이해하고 있는지 묻는 것으로 

char s[11] = "hell world"; 문장을 실행하면 s라는 문자열 배열에는 'h', 'e', 'l', 'l', ' ', 'w', 'o', 'r', 'l', 'd', '\0'이 차례대로 입력됩니다. C에서 문자열 상수는 큰 따옴표(")로 표현하는데 문자열 배열 초기화시 "..."를 사용하면 해당 배열 크기의 범위 내에서 지정한 문자들로 초기화하고 맨 마지막에 널 문자를 입력합니다. 그런데 배열의 크기를 널문자를 감안하여 예제처럼 여유있게 선언하지 않고 널 문자를 감안하지 않으면 해당 배열크기 만큼만 초기화되고 널 문자가 없는 문자열이 되므로 프로그램 오동작의 원인이 될 수 있는 것입니다. 

두번째 문장 s[4] = '\0'; 는 문자열의 다섯번째 위치(C언어에서 배열의 첫 원소는 0으로 지칭)에 널 문자를 강제적으로 삽입한 것으로 널 이후의 문자들은 문자열 처리에 있어 의미를 잃게 됩니다. 결과적으로 printf 문장에서 s 문자열을 출력하는 %s에 대해서는 "hell"만 표시되는 것입니다. 물론 %s 형식 앞뒤에 있는 S와 E는 단순 문자 출력을 의미하므로 정답은 1번이 됩니다.

끝으로 위의 예제에서 프로그램 실행중에도 s = "good test"; 와 같은 문장도 가능할까요? 답은 문법 오류가 발생합니다. s의 배열의 대표명일 뿐이고 "good test"는 임의의 메모리 영역에 저장한 문자열의 포인터 값이기 때문에 그렇습니다. 만약에 char *ptr; 과 같은 문자열 포인터를 선어했다면 실행중에도 ptr = "good test"; 아 같은 문장을 사용할 수 있습니다. ptr 변수 자체가 문자열의 주소를 가질 수 있는 포인터 변수이기 때문입니다.

C언어에서 가장 골치 아픈 부분이 바로 스트링 처리입니다. 메모리 할당, 해제까지 연관되면 조금더 복잡해지므로 이참에 스트링 처리에 대한 분명한 이해를 짚고 넘어 가시기 바랍니다.

728x90
댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함