문자열
문자열이라는 것은 문자의 모음이다. 'C'는 문자 "Computer" 는 문자열. 그러므로 문자형 변수가 여러개가 모인 것이 문자열이므로 문자 배열로 표현할 수 있다.
Ex> char string[30] = "computer";
"computer"는 총 여덟개의 문자 모음이다. 그래서 0번부터 7번까지 출력을 하도록하면 되는데 저장 값을 알고 있기 때문에 0번 부터 7번까지 출력을 하면 된다고 생각을 하지만 길이를 모르는 경우에는 어떻게 출력을 할 것인가. 그래서 문장의 끝을 알려주는 문자 '\0'이 사용된다. 문자열의 끝을 알려주는 NULL이라는 문자다.
위에서 "computer" 라고 값을 넣어주게되면 자동으로 끝에 이 '\0'을 붙여준다. 그러므로 길이는 총 9가 된다.
|
string[0] |
string[1] |
string[2] |
string[3] |
string[4] |
string[5] |
string[6] |
string[7] |
string[8] |
|
... |
'c' |
'o' |
'm' |
'p' |
'u' |
't' |
'e' |
'r' |
'\0' |
... |
이렇게 들어있다고 볼 수 있다.
출력하는 방법은 두가지가 있다.
- 소스 코드 예시
char string[30] = "computer";
for(int i = 0; i < 9; i++)
{
cout << string[i];
}
cout << endl;
cout << string << endl;
반복문으로 출력하는 방법과 모배열을 사용하여 출력하는 방법 두가지가 있다. 모배열을 사용하여 출력하는 방법이 편리하지만 안에 '\0'값이 제대로 들어있지 않다면 이상한 범위까지 출력하게 된다. 이유는 분명 배열은 연속적인 공간 그리고 모배열만 사용하여 출력하는 경우는 어디까지 출력해야하는지 크기를 모른다. 그렇기 때문에 NULL문자를 만날 때까지 계속해서 출력을 하는 것이다. 그렇기때문에 할당받은 배열의 크기가 끝나더라고 계속해서 연속되어있는 메모리 공간을 따라 출력을 하는 것이다. 꼭 널문자를 잊지말고 생각하여야한다.
그렇다면 배열보다 큰 문자열을 넣으려고 한다면?
위와 같이 배열의 크기를 넘어서서 오버플로우가 발생했다는 오류가 뜬다. 크기는 항상 문자열의 끝을 나타내는 널문자까지 포함해서 생각을 해서 정해야한다,
이상한 점이 없었는가? 이전에 배열에서 모배열은 배열의 첫번째 주소를 나타낸다고 하였다. 근데 문자열을 출력시 모배열을 출력하면 문자열이 출력된다?!
그렇다면 문자 변수는?
- 소스 코드 예시
char a = 'c';
cout << a << endl;
cout << &a << endl;
값은 잘 출력이 되는데 주소는 주소가 아니라 변수의 값과 뒤에 이상한 문자들이 나왔다. 이것은 문자형 변수 a의 값을 출력하고 그 바로 뒤에 알 수 없는 값들을 연달아 출력한 것이다. 문자형 변수의 주소를 확인하기 위해서는 cout으로 출력할 때는 형변환을 시켜서 출력을 해야한다.
- 소스 코드 예시
char a = 'c';
cout << hex << (int)&a << endl; // hex는 16진수로 출력되게 한다. 주소를 출력하기 때문에 16진수로 변환.
주소가 잘 출력되는 것을 볼 수 있다.
- 출처 : 열혈강의 C++ 언어본색
※ 책을 보고 공부한 내용을 정리하였기때문에 내용이 책과 다를 수 있습니다.