36 입력 값을 문자열에 저장하기
'Unit 11 입력 값을 변수에 저장하기'에서 사용자의 입력 값(표준 입력)을 정수, 실수, 문자 변수에 저장했습니다. 이번에는 사용자의 입력 값을 문자열에 저장해보겠습니다.
36.1 입력 값을 배열 형태의 문자열에 저장하기
scanf 함수에서 서식 지정자로 %s를 사용하면 입력 값을 배열 형태의 문자열에 저장할 수 있습니다(stdio.h 헤더 파일에 선언되어 있습니다).
- scanf("%s", 배열);
- int scanf(char const * const _Format, ...);
- 성공하면 가져온 값의 개수를 반환, 실패하면 EOF(-1)를 반환
다음 내용을 소스 코드 편집 창에 입력하세요.
scanf_string_array.c
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지 #include <stdio.h> int main() { char s1[10]; // 크기가 10인 char형 배열을 선언 printf("문자열을 입력하세요: "); scanf("%s", s1); // 표준 입력을 받아서 배열 형태의 문자열에 저장 printf("%s\n", s1); // 문자열의 내용을 출력 return 0; }
소스를 컴파일하여 실행하면 "문자열을 입력하세요:"만 출력됩니다. 이 상태에서 Hello를 입력하고 엔터 키를 누르세요.
실행 결과
문자열을 입력하세요: Hello (입력) Hello
scanf("%s", s1);과 같이 scanf 함수에 서식 지정자로 %s를 넣어서 문자열을 입력받을 수 있도록 설정합니다. 그리고 두 번째 매개 변수에는 입력 값을 저장할 배열을 넣습니다. 단, 일반 변수와는 달리 배열 앞에는 &를 붙이지 않습니다(배열도 포인터처럼 주소를 담고 있으므로).
int num1; char s1[10]; scanf("%d", &num1); // 일반 변수일 때는 변수 앞에 &를 붙임 scanf("%s", s1); // 배열은 앞에 &을 붙이지 않음
char s1[10];과 같이 크기가 10인 char형 배열을 선언했으므로 s1에는 문자를 10개만 저장할 수 있겠죠? 여기서 문자열 맨 뒤에 붙는 널 문자까지 포함하면 실제로 저장할 수 있는 문자는 9개 입니다. 따라서 입력할 때 문자열의 개수가 배열의 크기 - 1을 넘지 않도록 하고, 좀 더 길게 입력하고 싶다면 배열의 크기를 크게 만듭니다.
scanf에서 서식 지정자 %s로 문자열을 저장할 때 입력된 문자열에 공백이 있다면 배열에는 공백 직전까지만 저장됩니다. 예를 들어 중간에 공백이 있는 Hello, world!를 입력하면 Hello,까지만 저장됩니다.
scanf 함수에서 서식 지정자를 "%[^\n]s"와 같이 지정하면 공백까지 포함하여 문자열을 입력받을 수 있습니다.
scanf_string_with_space.c
char s1[30]; printf("문자열을 입력하세요: "); scanf("%[^\n]s", s1); // 공백까지 포함하여 문자열 입력받기 printf("%s\n", s1);
실행 결과
문자열을 입력하세요: Hello, world! (입력) Hello, world!
EOF는 End Of File의 약자인데 더 이상 값을 읽을 수 없는 상태를 나타냅니다(말 그대로 파일의 끝이기도 합니다. 파일의 끝에서는 값을 읽을 수가 없죠). 콘솔(터미널, 명령 프롬프트)에서는 다음 키의 입력을 EOF로 정해놓았습니다.
- Windows: Ctrl+Z
- 리눅스: Ctrl+D
int c1 = getchar(); // 문자를 입력받음 printf("%d\n", c1); printf("%d\n", EOF); // -1
소스를 컴파일하여 실행한 뒤 Ctrl+Z를 입력하면 다음과 같이 출력됩니다.
실행 결과(Windows)
^Z (Ctrl+Z 입력) -1 -1
EOF는 stdio.h 헤더 파일에 정의되어 있으며 정수 -1입니다. 보통 EOF는 파일 처리 함수가 실패했을 때 반환됩니다.