6. 표준 입출력(Standard Input/Output)
1. 키워드
- 표준 입출력(Standard Input/Output)
2. 입력 값을 변수에 저장하기
- 콘솔에서 입력하는 방식을 표준 입력, 출력하는 방식을 표준 출력이라 한다.
- 먼저
scanf
함수를 사용하여 표준 입력으로 사용자의 입력을 받아보자.
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
int main()
{
int num1;
printf("정수를 입력하세요: ");
scanf("%d", &num1); // 표준 입력을 받아서 변수에 저장
printf("%d\n", num1); // 변수의 내용을 출력
return 0;
}
// 정수를 입력하세요: 1 (입력)
// 1
- 입력한 값이 그대로 출력된다.
scanf
함수는 표준 입력을 받아서 변수에 값을 저장하는 함수이다.
- 다음과 같이
scanf
함수의 첫 번째 인수에는""
안에 서식 지정자를 넣어서 입력 받을 값의 형태를 설정한다. - 그리고 두 번째 인수에는 입력 값을 저장할 변수를 넣는데, 여기서 주의할 점은
&num1
처럼 변수 앞에&
를 붙여주어야 한다는 것이다.
scanf
함수로 입력 값을 변수에 저장한 뒤printf
함수로 다시 화면에 출력했다.- 그래서 입력한 그대로 값이 출력되는 것을 볼 수 있다.
- 맨 처음
#define _CRT_SECURE_NO_WARNINGS
는 Visual Studio에서만 넣어주면 되며, 리눅스나 OSX 사용자라면 넣지 않아도 된다. scanf
함수는 나온 지 오래된 함수라 입력 값의 길이를 설정할 수가 없다.- 따라서 보안에 취약하기 때문에 Visual Studio에서는 사용하지 말라는 경고가 출력되고 컴파일 에러가 발생한다.
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
를 넣지 않고scanf
함수를 사용하면 다음과 같이 컴파일 에러가 발생한다.
scanf_integer.c(8): error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\stdio.h(1270): note: 'scanf' 선언을 참조하십시오.
scanf_s
함수를 대신 사용하거나_CRT_SECURE_NO_WARNINGS
를 사용하라고 나온다.scanf_s
함수는 입력 값의 길이를 설정할 수 있지만 C 표준 함수는 아니며 Visual Studio(Visual C++) 전용이다.
표준 입력, 표준 출력
- 콘솔에서는 키보드 입력이 표준 입력이고, 콘솔에 글자를 보여주는 것이 표준 출력이다.
- 표준 입력과 표준 출력의 형태는 정해져 있지 않고 설정하기에 따라 달라진다.
- 즉, 리다이렉션(
<
,>
)과 파이프(|
)라는 것을 사용하면 파일의 내용을 표준 입력으로 보낼 수도 있고, 표준 출력을 파일로 저장할 수도 있다.
3. 한 번에 정수 두 개 입력 받기
- 이번에는 값을 두 개 입력 받아서 변수 두 개에 저장해 보자.
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
int main()
{
int num1, num2;
printf("정수를 두 개 입력하세요: ");
scanf("%d %d", &num1, &num2); // 값을 두 개 입력 받아서 변수 두 개에 저장
printf("%d %d\n", num1, num2); // 변수의 내용을 출력
return 0;
}
// 정수를 두 개 입력하세요: 1 2 (입력)
// 1 2
- 입력 값 두 개가
num1
,num2
변수에 각각 저장된다. - 그리고
printf
함수를 통해num1
,num2
의 값이 출력된다. scanf
함수는printf
함수와 사용 방법이 유사하다.- 입력 받을 개수만큼 서식 지정자를 넣어주고, 서식 지정자 개수만큼 변수를 넣어주면 된다.
4. 실수 입력 받기
- 이번에는 실수를 받아서 변수에 저장해 보자.
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
int main()
{
float num1;
printf("실수를 입력하세요: ");
scanf("%f", &num1); // 실수를 입력 받아서 변수에 저장
printf("%f\n", num1); // 변수의 내용을 출력
return 0;
}
// 실수를 입력하세요: 1.1 (입력)
// 1.100000
- 실수를 입력 받을 것이므로 변수는
float
타입으로 선언해 주고,scanf
에 서식 지정자로%f
를 설정해 준다. - 즉, 입력 받고자 하는 자료형에 맞게 변수를 선언하고, 서식 지정자도 맞춰준다.
- 만약 정수
1
을 입력하더라도 서식 지정자가%f
이고float
타입 변수에 저장되므로1.0
이 된다.
- 여기서 변수를
double
타입으로 선언했다면scanf
에는 서식 지정자로%lf
를 넣고,long double
타입으로 선언했다면%Lf
를 넣는다. - 참고로
double
타입은printf
로 출력할 때%f
를 써도 되지만,scanf
는%lf
를 써야 한다.
double num1;
scanf("%lf", &num1); // 자료형이 double 타입일 때는 %lf
long double num2;
scanf("%Lf", &num2); // 자료형이 long double 타입일 때는 %Lf
5. 문자 입력 받기
- 숫자뿐만 아니라 문자도 입력 받을 수 있다.
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
int main()
{
char c1;
printf("문자를 입력하세요: ");
scanf("%c", &c1); // 문자를 입력 받아서 변수에 저장
printf("%c\n", c1); // 변수의 내용을 출력
return 0;
}
// 문자를 입력하세요: a (입력)
// a
- 마찬가지로 문자를 입력 받을 것이므로 변수는
char
타입으로 선언해 주고,scanf
에 서식 지정자로%c
를 설정해 준다. scanf
에서%c
는 문자 한 개만 입력 받을 수 있으므로, 문자를 여러 개 입력해도 첫 번째 문자 한 개만 저장되고 나머지는 모두 무시된다.
getchar
로 문자 입력 받기
scanf
함수 대신getchar
함수를 사용해도 문자를 입력 받을 수 있다.
#include <stdio.h>
int main()
{
char c1 = getchar(); // 문자 하나를 입력 받음
printf("%c\n", c1); // 변수의 내용을 출력
return 0;
}
// a (입력)
// a
getchar
함수는 표준 입력에서 문자 하나를 입력 받은 뒤 결과를 반환한다.- 만약 문자 여러 개를 입력해도 첫 번째 문자만 반환된다.
getchar
함수에 대응하는 함수로putchar
가 있는데 이 함수는 문자 하나를 화면에 출력한다.
getchar
,putchar
함수 모두stdio.h
헤더 파일에 선언되어 있다.