2.5 Reading Input

dweight.c 프로그램이 박스 단 하나의 dimensional weight를 계산하기 때문에, 특별히 유용한것은 아니다. 프로그램을 개선하려면 우리는 사용자가 dimension을 입력하도록 허용할 필요가 있다. 

입력을 갖기 위해서는, printf와 상응하는 C라이브러리의 scanf함수를 사용할 것이다. scanf의 f는 printf와 마찬가지로 "formatted"를 의미하며, 둘 모두 입력 또는 출력 데이터의 모양을 지정하기 위해 형식문자열(format string)을 사용해야한다. scanf는 printf가 어떻게 출력데이터를 표시할지 알아야하는 것처럼, 어떤 형식의 입력데이터가 들어올지 알아야한다. int 값을 읽기 위해 우리는 다음과 같이 scanf를 쓸 것이다.

scanf("%d", &i); /* reads an integer; stores into i */

%d 문자열은 scanf에게 정수를 나타내는 입력을 읽도록 지시하며, i는 scanf가 입력을 저장하도록 하는 int 변수이다. 현재는 &기호를 설명하기 어려우니, scanf를 사용할때 필수적으로 사용한다고 생각하자.(그러나 항상 그런것만은 아니다.)

float값을 읽으려면 약간 다른 scanf의 호출이 필요하다.

scanf("%f", &x); /* reads a float value; stores into x */

%f 는 float 변수인 경우에만 사용할 수 있다. 그러므로 x라는 변수는 float 변수임을 짐작할 수 있을 것이다 %f 문자열은 scanf가 float 형식의 입력값을 찾도록 지시한다. (소숫점을 가질 수도 있으나, 없어도 됨.)

 

PROGRAM: Computing the Dimensional Weight of a Box(Revisited)

다음은 유저가 수치를 직접 입력할 수 있는 향상된 버전의 dimensional weight 프로그램이다. 각각의 scanf 호출은 printf의 호출을 선행한다. 이렇게 하면 사용자는 입력 시기와 무엇을 입력할 지 알 수 있다.

/* dweight2.c 
   Computes the dimensional weight of a box from input provided by the user*/
  
 #include <stdio.h>
 
 int main(void)
 {
   int height, length, width, volume, weight;
   printf("Enter height of box: ");
   scanf("%d", &height);
   printf("Enter length of box: ");
   scanf("%d", &length);
   printf("Enter width of box: ");
   scanf("%d", &width);
   volume = height * length * width;
   weight = (volume + 165) / 166;
   
   printf("Volume (cubic inches): %d\n", volume);
   printf("Dimensional weight (pounds): %d\n", weight);
   
   return 0;
 }
 

프로그램은 다음과 같이 출력된다. (사용자 입력부분은 주석표시함)

Enter height of box: 8         //사용자입력:8
Enter length of box: 12        //사용자입력:12
Enter width of box: 10         //사용자입력:10
Volume (cubic inches): 960
Dimensional weight (pounds): 6

사용자에게 입력값(프롬프트)를 입력하라는 메세지는 일반적으로 개행문자로 끝나면 안된다. 사용자가 프롬프트 자체와 동일한 줄에 값을 입력하기를 희망하기 때문이다. 사용자가 엔터키를 누르면 커서가 자동으로 다음줄로 이동하므로, 현재 줄을 종료하기 위한 개행문자를 표시할 필요가 없다.

dweight2.c 프로그램에 문제가 있는데, 사용자가 숫자가 아닌 값을 입력하는 경우 프로그램은 제대로 작동하지 않는다. 이 부분은 3.2장에서 자세하게 다룰 것이다.

+ Recent posts