문자열 입력: 저번에는 char형 배열을 이용한 문자열 입력을 알아 보았다. 오늘은 scanf 함수를 이용하여 배열에 문자를 입력 받아 봅시다.
서식 문자 %s 를 이용하여 printf 함수를 사용한다. 그와 마찬가지로 scanf 함수도 서식 문자 %s 를 이용하여 문자를 입력 받는다.
아래 예제를 봅시다.
- 5 행 : 배열을 이용하여 문자열을 입력 받을 경우에는 배열의 길이는 좀 여유있게 하는 것이 좋다.
- 9 행 : 서식 문자 %s 는 문자열을 입력 받을 것이라는 표시이다.
scanf 함수는 아래처럼 출력 대상의 앞에 & 연산자를 삽입해주는 것이 원칙이라고 하였다.
scanf ( ” %d”, &number) ;
그러나 , 문자열을 입력 받을 경우에는 & 연산자를 사용하지 않는다.
& 연산자가 문자열을 입력 받을 경우에 사용하지 않는 이유는 포인터를 학습한 후에나 이해할 수 있다. 지금은 그러니 대충 넘어가고 아래에 것을 기억하는 것이 좋다.
scanf 함수 사용할 경우에 배열 이용하여 문자열을 입력 받을 때에는 예외적으로 & 연산자를 쓰지 않는다. - 13행에서 17행까지 while 반복문을 이용하여 문자열을 이루는 문자를 하나 하나 받아서 출력하는 것이다. 즉 , 첫 번째 배열 요소부터 null 문자를 받을 때까지 차례로 출력을 한다. 예컨대 , apple를 입력하면 문자열이 위의 반복문을 통하여 올바르게 출력 된다. 이것으로 scanf 함수도 printf 함수와 같이 입력 받은 문자열의 끝에 널 문자가 자동으로 삽입된다는 것을 알 수 있다.
즉 , 배열을 이용한 문자열 이외에도 c언어의 모든 문자열 끝에는 null 문자가 자동으로 붙게 된다.
위 예제의 실행 결과는 다음과 같다. ( apple 이라는 문자열을 입력한다고 가정합시다.)
문자열 입력 : apple
입력 받은 문자열 : apple
문자 단위 출력 : apple
문자열 입력 그리고 null 문자
널 문자는 C언어의 문자열에서 필수적인 요소이다.
null 문자가 있어야 문자열이다. 그래서 널 문자가 없다면 문자열이 아니라고 볼 수 있다. 예컨대 , 아래와 같이 널 문자가 없는 문자 배열은 문자열이 아니고 단순한 문자 배열일 뿐이다.
char array [ ] = { ‘O’ , ‘K’, ‘!’ } ; // 마지막 배열 요소가 null 문자가 아니다.
위의 배열을 올바른 문자열로 구성하기 위해선 다음과 같이 수정해야 한다.
char array [ ] = { ‘O’ , ‘K’, ‘!’ , ‘\0’ } ; // 배열 끝에 null 문자가 존재한다.
정리하자면 문자열의 끝에 null 문자가 반드시 삽입되는 이유는 문자열이 종료되었다는 것을 알려주기 위함이다.
널 문자가 없는 경우의 문자열에 대한 아래 예제를 봅시다.
- 5 행 : 배열 길이가 5 인 char 타입의 배열을 선언했다.
- 7 행 ~ 8 행 : 첫 번째와 두 번째 배열 요소에 문자를 할당하였다.
위 예제의 실행 결과는 NO가 나온 후에 이상한 값들이 붙어서 출력 된다.
그 이유는 5행에서 배열을 초기화하지 않았기 때문에 s[0], s[1] 이외에는 쓰레기 값이 이미 들어있고 null 문자가 없기 때문에 문자열의 끝을 알 수 없어서 쓰레기 값이 나오기 때문이다.