오늘은 입출력에 대한 개념을 이해하는 시간을 갖도록 하겠습니다. 지난 시간 데이터를 변수라는 저장공간에 저장하여 다룰 때 데이터의 자료형을 표현 해야한다고 했습니다. 즉, 선언, 입력, 출력 시 해당 데이터의 자료형을 명확하게 표현을 해야 합니다. 지난 시간에는 변수의 선언에 대해서만 다뤘는데 오늘은 입출력 시 자료형을 어떻게 선언하는지 알아봅시다.
%d : 정수형(10진수)
%c : 문자형
%s : 문자열
%f : 부동소수점형
%o : 8진수형
%x : 16진수형
기타 등등이 있지만 생략하고 정수, 문자형, 부동소숫점형 정도만 알고 있으시면 됩니다. 입력을 받을 때와 출력을 할 때 이 세가지 정도만 초반에 자주 사용하니깐 숙지해 놓으면 좋습니다.
쉽게 정수로 입력을 받거나 출력하면 형태는 %d다 문자면 %c이고 문자열이면 %s로 쓰고 부동소숫점이면 %f써야지 이정도만 입출력시 자료형을 맞춰주시면 됩니다. 그 형태에 맞게 읽어오고 출력을 하게 됩니다.
scanf() 함수로 데이터를 입력 받습니다. 외부에서 사용자가 데이터를 입력하면 scanf()함수는 그 데이터를 변수에 저장하게 됩니다.
[표현]
scanf("입력형",변수주소) - 외부에서 입력 된 데이터를 입력형에 맞게 해당 변수주소에 저장하라.
int a;
scanf("%d",&a);
a라는 변수가 int 정수형으로 선언 이 되었습니다. 입력도 정수형 받기 때문에 표현을 %d가 정수형입니다. 10진수로 보시면 됩니다.
외부에서 10이 입력 되면은 a에 10진수 형태로 10이 저장되게 됩니다.
주의할 점은 scanf()함수에서 변수는 주소를 인자로 받습니다. 간혹 주소지를 생략하거나 혼동하시는 분들이 있습니다. 포인트나 배열변수의 경우 번지(&)기호를 혼동해서 쓰시는 분들이 있는데 확실히 개념을 잡아 두세요.
int a;
a라는 변수가 선언 되었다면 a은 변수명이고 a의 번지는 &a가 됩니다.
char b[10];
b라는 변수가 선언 되었다면 혼동하시는 분들은 &b로 코딩하시는 분들이 있습니다. b자체가 b의 번지입니다. 변수 이름은 b[0]이렇게 시작하는 거고 b는 b[0]의 주소지가 됩니다.
그래서 scanf()함수는
char b[10];
scanf("%d",b);
이렇게 하면 외부에서 최대 10개의 문자를 입력 받게 됩니다.
예) 문자열 입력
#include
int main()
{
char b[10];
scanf("%s",b);
printf("%s \n",b);
return 0;
}
[결과]
포인트변수이면 포인트기호를 넣지 않고 그냥 변수 네임만 적으면 번지가 됩니다. 이 부분을 설명하자면 포인트변수에 대한 개념을 다시 짚고 나서 다시 포인트변수의 주의점까지 이야기 하면 삼천포로 빠지니깐 배열 변수처럼 네임만 적으면 된다는 적도로 머리속에 넣어 두시면 됩니다.
두 함수의 차이는 인자의 갯수 입니다. 똑같은 동작을 하는데 scanf_s()함수는 세번제 인자은 입력 받는 크기를 지정하게 됩니다. 크기를 맞추지 않게 되면 입력시 데이터 크기의 오류로 비정상적인 값을 입력변수주소지에 저장되게 됩니다. 그러면 입력 값에 대한 처리가 비정상적으로 이루어 지겠죠. 그걸 막기 위해서 크기를 지정하면 크기에 맞게 데이터를 읽어오기 때문에 오류를 사전에 막을 수 있는 장점을 갖고 있습니다.
동작은 같고 그냥 안정장치가 하나 붙었다고 보시면 됩니다. 굳이 scanf_s()를 써야하는 것은 아닙니다. 제 경우도 그냥 scanf()함수로 자주 써왔습니다. 정확히 맞게 데이터를 입력하고 정확히 맞게 변수크기를 맞춰서 입력 받는다면 문제는 없으니깐요.
printf()함수로 위 예제를 연장으로 살펴 보도록 하겠습니다.
int a;
scanf("%d",&a);
printf("%d \n",a);
위 코딩을 보시면 입력은 %d로 정수형으로 받고 다시 출력은 %d로 정수형으로 출력하게 됩니다. 이처럼 입력이든 출력이든 데이터의 형태를 지정 할 수 있습니다.
코딩 초심자들이 자주하는 실수 중 하나입니다. 어떤 데이터를 다룰 때 그 데이터의 원래의 자료형으로 사용하지 않고 다른 형태로 입출력하는 경우에 원하는 값으로 처리 되지 못하는 경우가 발생합니다.
#include
int main()
{
char a;
scanf("%c",&a);
printf("%d \n",a);
return 0;
}
위와 같이 a라는 변수를 문자변수로 선언해서 알파벳 한글자를 받아 올 수 있게 했습니다. 하지만 출력은 읽은 알파벳을 정수형으로 출력하게 됨으로 아스키코드값 숫자로 출력이 됩니다. 원하는 알파벳을 입력받아 알파벳으로 출력시켜야 했지만 출력문에서 문자형을 숫자형으로 출력형태를 정했기에 원하는 알파벳은 나오지 않게 됩니다.
[결과]
위와 같이 원하는 결과가 나오지 않게 됩니다. 그렇기 때문에 입력이든 출력이든 주의해서 자료형태를 정확히 지정해줘야 원하는 결과를 얻을 수 있으니깐 주의를 해서 코딩을 해야 됩니다.
두 수를 입력받아 더하기
**[코딩] **
#include
int main(int argc, char *argv[]) {
int a;
int b;
char c[10];
scanf("%d",&a);
scanf_s("%d",&b,1);
scanf_s("%s",c,sizeof(c));
printf("%s = %d + %d = %d \n",c,a,b,a+b);
return 0;
}
[결과]
C언어에서 선언, 입력, 출력에는 꼭 자료의 형태를 명확시 명시 해야 오류를 줄이고 원하는 동작을 수행 할 수 있습니다. 이 개념만 잘 잡아 두세요. 그리고 실험에 나온 코딩을 보시고 덧셈, 뺄셈, 곱셈, 나눗셈을 한번 만들어 보세요.