카테고리 없음

C 언어 + [문자열] 문자열 너는 누구냐?

카카오블로거 2021. 12. 30. 23:12

행인 : 한 발로 서서 나를 깨우치게 하라.

랍비 : 너가 하기 싫은 일을 남에게 시키지 마라.

성공의 절반은 인내심이다.
유태인은 이 격언을 이렇게 이해한다.
'성공하는 데에는 인내가 필요하다. 그러나 동시에 인내만으로는 성공할 수 없음을 가르쳐 준다'라고.

유태인은 지적으로는 솔직하지 못하다.

유태인은 항상 호기심에 불타고 있어서 사물을 여러 각도에서 보려고 노력한다.

'헤브라이'의 뜻은 '또다른 한편에 선다'는 뜻이다.

문자열 이노옴... ㅋㅋㅋ 너가 뭐길래 이렇게 사람들을 고생시키는 것이냐?

자.. 가 봅시다. 또 다른 한편에 서 봅시다... ㅋㅋ

포인터라는 개념을 사실 어려운 것이 아닙니다. 진짜로 어려운 것은 포인터들의 쓰임이 다양하다는 것이죠.

초보자와 문자열의 대화 속에서 문자열에 대해 이해해 보도록 해 보자구영~^^

딩동... 문자열님이 로그인하였습니다...

초보자 : 안뇽하세요.

문자열 : 안녕... 초보

 

 

초보자 : 문자열, 당신에 대해 알고 싶어요.

문자열 : ...

 

 

초보자 : 문자열 땜에 미티겠떠여... ㅠ.ㅠ 아저씨의 정체를 낱낱이 알려 주세용.

문자열 : 문자들이 연속된 번지에 나열되어 있는 것이 문자열이지. 그리고 맨 뒤는 널문자로 끝나.

 

초보자 : 그게 다에요? 널 문자요?

문자열 : .. 널 문자, 문자열의 끝은 항상 널문자가 있어야 돼. 왜 널문자로 끝나게 되는지 한 번 맞춰 봐.

 

 

 

초보자 :

글쎄요... .. 널 문자가 뭔데요?

문자열 : 널이라는 것은 영단어로 NULL인데, NULL의 사전적 의미는 "제로의, 제로와 같은, 비어 있는, 공집합의"라는 뜻이 있지. C언어에서 NULL은 아스키 코드값이 0이야.

 

 

초보자 : 아스키 코드값이 0이면 숫자 0을 의미하나요?

문자열 : 아니지. NULL 문자는 아스키 코드값이 0이고, 문자 '0'은 아스키 코드값이 48이야. 예를 들어 다음과 같이 출력을 해 보면, 서로 값이 다름을 알 수 있지.

 

 

printf( "NULL의 아스키 코드값 : %d", NULL );  // 널 문자, 0이 출력

printf( "문자0의 아스키 코드값 : %d", '0' );      // 숫자 0, 48이 출력

 

 

초보자 : 널 문자도 문자네요. 널 문자로 끝나는 이유는 문자열의 끝이 어디인지 알기 위해서 넣어 놓는 것이 아닐까요?

문자열 : 맞아.

 

 

초보자 : 그럼 문자열 "abc"라고 하면, 맨 뒤에는 항상 널 문자가 있다는 말씀?

문자열 : 그렇지. c 뒤에 널 문자가 숨어 있지. 우리 눈엔 안보이지만, 실제로는 뒤에 들어가 있어. 만약 문자열의 끝에 널 문자가 없다면, abc 다음에 있는 모든 것들이 다 문자열처럼 취급되지. 한 번 해봐... 문자열이 출력될 때, 한자가 출력되는 경우 있잖아. 그거 다 문자열 처리를 잘못해서 그런 거야.

 

 

초보자 : .. 그렇구나... 그럼 문자열의 끝을 구분하기 위해서는 반드시 널 문자를 써야 하나요?

문자열 : 당연하지. 옛날에는 문자열의 끝을 구분하기 위해 '$'를 쓰기도 했지.

 

 

초보자 : 아하! 문자열의 끝은 반드시 널 문자가 있어야겠네요. 그럼 char* p = "abc";라고 했을 때, 왜 문자열의 끝에 널 문자를 넣어 주지 않나요?

문자열 : 그건 컴파일러가 알아서 널 문자를 넣어 주기 때문이지. 이중 따옴표(")로 감싸주면, 컴파일러는 문자 c 뒤에 무조건 문자 0을 추가해 주게 되어 있어.

 

 

초보자 : 컴파일러가 고맙네요.. 그런 걸 자동으로 해 주고.

문자열 : 저런 것만 그렇고. 그렇지 않은 경우는 너가 일일이 문자 0을 넣어 줘야 해.

 

 

초보자 : 널 문자는 어떻게 넣어 주면 되나요?

문자열 : 문자 0은 그냥 0이라고 사용해도 되고, NULL 또는 '\0'이라고 사용해도 돼. 3가지 방법이 동일해. 컴파일러에 따라서 0 NULL을 다르게 판단하는 것이 있긴 한데, 만약 윈도우 환경이 아닌 유닉스/리눅스라면, 널 문자를 '\0'이라고 사용하는 것이 좋을 거야.

 

 

초보자 : .. . 하나 더요.. 문자열을 사용하기 위해서는 데이터형이 모두 char형이던데, 특별한 이유라도 있나요?

문자열 : 당연하지. char형은 -128 ~ 127까지의 문자 값을 저장하기 위한 데이터형이야. char형은 <st1:personname w:st="on"><st2:sn w:st="on">문</st2:sn><st2:givenname w:st="on">자형</st2:givenname></st1:personname>이라고도 하지. char형은 한 개의 문자를 기억할 수 있지. 예를 들어 다음과 같이 하면 ch 변수는 문자 'a'를 기억하고 있게 되지.

 

 

char ch = 'a';

 

 

 

초보자 : 그럼 ch는 오직 문자를 하나만 기억할 수 있잖아요. 문자를 두 개 기억할 수는 없나요?

문자열 : 없어. ch는 한 바이트짜리 변수이기 때문에, 2바이트를 기억하는 것은 불가능하지.

 

 

초보자 : 그럼 2바이트를 저장하기 위해서는 어떻게 해야 하나요?

문자열 : <st1:personname w:st="on">문자형</st1:personname>을 2개 사용하면 되지.

 

 

초보자 : 2개를 연속해서요? 그게 가능해요?

문자열 : , 진짜 초보구나. 배열도 몰라요... 문자열도 몰라요... 배열을 모르면 문자열을 이해하기 힘들어.

 

 

초보자 : 배열은 알지요. 배열은 데이터형이 같은 애들을 한 군데에 집합적으로 모아 두는 것이잖아요.

문자열 : 오옷... 그건 아네. 그럼 문자 2개를 넣으려면 어떻게 선언해야 하는데?

 

 

초보자 : 2바이트 배열을 사용하면 되겠네요. char ch[2]; 라고 하면 되지요.

문자열 : 훌륭하네. 5바이트는?

 

 

초보자 : char ch[5]; 라고 하면 되겠지요.. 당연히.

문자열 : ... 맞았어. 그럼 "abcde"가 들어가게 하려면 어떻게 선언해야 해?

 

 

초보자 : char ch[5]; 라고 하면 되잖아요.

문자열 : ... 진짜야? 사실이야? 둥둥둥둥둥... .. ... 티티티틱... 티틱.. 짠 짠

 

 

초보자 : ... 문자가 다섯 개니까.. a, b, c, d, e가 순서대로 들어가고... .. 널 문자를 넣을 공간이 없네요. 그럼 char ch[6]; 이라고 해야겠네요. 그래야 널 문자를 문자열의 끝에 넣을 수 있지요.

문자열 : 맞았어. 초보자들이 가장 많이 실수하는 것이 바로 널 문자를 위한 공간을 만들지 않는다는 것이야. 또한 문자열을 위한 충분한 공간을 만들지 않아서 발생하는 문제도 많지.

 

 

초보자 : 문자열을 저장하기 위해 배열을 선언할 때, 사용 가능한 크기는 얼마나 되요?

문자열 : 원하는 만큼.... 예를 들어 10000바이트 크기의 문자열이 필요하면, char ch[10000]이라고 선언해. 그럼 9999바이트의 문자와 1바이트의 널 문자를 넣을 수 있으니까.

 

 

초보자 : 아하.. 대충은 알 것 같네요.

문자열 : 문자열 처리할 때 가장 주의해야 할 것이 문자열의 끝은 항상 널 문자로 끝나야 한다는 것과, 문자열을 저장할 충분한 버퍼를 선언하는 것이야. 처음에는 이것 때문에 많은 실수를 하곤 하는데, 실수를 하다 보면 실력이 늘게 되어 있어.

 

 

초보자 : .. 문자에 대해 다시 한 번 설명해 주세요.

문자열 : 문자는 A, B, C 이런 것들이 문자야. 흔히 아스키 코드라고 하는데, A~Z, a~z, 0~9, 기타 특수 기호 등이 아스키 코드에 해당하지...

 

 

초보자 : 좀 더 쉽게 표현해 주세용.

문자열 : 키보드에 있는 것들이 대부분 문자야.

 

 

초보자 : 그럼 그런 문자들이 연속된 공간에 나열되어 있는 것이 문자열이네요?

문자열 : .. 맞아.

 

 

초보자 : 문자열의 예를 들어 주세요.

문자열 : "2006년 월드컵", "a", "bool", ... 이런 것들이 다 문자열이야.

 

 

초보자 : "는 뭐에요?

문자열 : 문자들을 좌우에서 감싸는 더블쿼테이션-이중따옴표(")가 바로 문자열을 만들 때 사용하는 거지.

 

 

초보자 : "만 쓰면 문자열이 되나요?

문자열 : .. "문자열"처럼 문자열의 좌우에 "를 사용하면 돼.

 

 

초보자 : 그럼 'a' 이건 뭐에요?

문자열 : 그건 문자라고 하지. 문자 a라고 읽으면 돼.

 

 

초보자 : 문자와 문자열을 다른가요?

문자열 : 그렇지, 문자는 컴파일할 때 수치로 변환되고, 문자열은 컴파일러에 의해 저장될 위치를 배정받고, 번지값을 얻어오지.

 

초보자 : OTL. 조금 어렵네요.. 그건 다음에 알려 주세요.

문자열 : 그러지. 좋은 하루

 

오늘은 즐거운 일요일입니다... 내일부터는 오전 강의가 있네요.. 조금 바뻐질 듯.. ㅋㅋ

또 졸리네요.. 오후 12:7분인데.. 왜 졸릴까요.. 내일 강의를 위해 컨디션을 조절해야 하는데.. ㅠ.ㅠ