티스토리 뷰


본 강좌는 아래 동영상 강좌와 같이 진행됩니다. 되도록이면 동영상과 같이 보시는 것을 추천합니다.

 

 

유튜브 채널 가기

 

강좌 6편 동영상 보기

 

 


 

 

 이번시간에는 사용자의 입력을 받는 '입력문'에 대해 알아보고, 이를 이용해 성적관리 프로그램을 업그레이드 해보도록 하겠습니다..

 

 

 

 1. 입력문

 

  ◆ getchar()

  단일 문자의 입력을 받습니다. 여러 문자를 입력시엔 제일 처음 입력한 문자만 저장됩니다.

 

int getchar();

 

 이렇게 int 형을 반환합니다. 이 int형은 그냥 char 변수로 받으면 되는데, 자료형을 알아볼때 char형은 -128 ~ 127 사이의 값을 가지고, 이 값은 아스키 코드라는 것에 대응하며, 이를 문자로 바꿔 출력된다고 했었습니다. 그래서 실제 사용시에는

 

char a;

a = getchar();

 

 와 같이 사용하며, char형 변수 a에 입력받은 값이 들어가는 것입니다. 한글의 경우 한글자에 2바이트만큼 공간을 차지하기 때문에 이것으로는 입력을 받을 수 없고, 오로지 1바이트 크기를 가지는 영문자나 숫자등만 입력을 받을 수 있다는 것도 알아두시기 바랍니다.

 

 ◆ gets()

 문자열의 입력을 받습니다. 엔터키를 입력할때까지 입력한 문자열이 저장됩니다.

 

gets(입력받을 문자열 변수);

 

 사용 예를 봅시다.

 

char str[80];

gets(str);

 

 이렇게 사용했을 경우 엔터키를 입력할때까지 입력한 모든 내용이 str 변수에 저장이 되는데, 여기서 str 변수는 크기가 80 이기 때문에 이 크기를 벗어난 입력을 했을 경우 애러를 발생하게 됩니다. 그래서 되도록이면 gets() 사용은 권장되지 않습니다. 대신에 gets_s()를 사용하는 것이 좋습니다.

 

gets_s(입력받을 문자열 변수, 입력받을 문자열 변수의 크기);

 

 이것을 사용할 것을 권하고 있습니다. 사용 예를 들어보면

 

char str[80];

gets_s(str, 80);

 

 gets()에 크기 항목 추가만 하면 됩니다. 문자열 입력이 필요하다면 gets_s()를 사용하면 되겠습니다. 위의 예를

 

char str[80];

gets_s(str, sizeof(str));

 

 이렇게 변형하면 위의 선언에서 str 변수의 크기를 바꾸더라도 아래줄의 크기 부분의 숫자를 고쳐줄 필요가 없어집니다. 여기서 사용한 것이 sizeof 라는 연산자인데, () 안 내용의 크기를 반환합니다. 자주 사용하기 때문에 꼭 기억하시기 바랍니다.

 

 ◆ scanf()

 여러개의 변수로 한번에 입력을 받습니다.

 

scanf("서식문자 ...", 변수, 변수, ... ,변수); 

 

사용법은 printf() 와 거의 비슷합니다. 예를 들어봅시다.

 

int a;

scanf("%d", &a);

 

int b, c;

scanf("%d %d", &b, &c);

 

char e;

char str[80];

scanf("%c %s", &e, str);

 

 첫번째 int형 변수 a에 입력을 받습니다. 출력문인 printf()와 거의 차이가 없습니다. 다만 변수명 앞에 '&'를 붙여 주었습니다. 이는 scanf()에서 변수의 주소를 인자로 받기 때문인데 나중에 '배열'과 '포인터' 에 대해 알아볼때 자세히 알아보기로 하고, 일단은 변수앞에는 '&'를 붙여준다고 기억하시기 바랍니다.

 

 두번째 int형 변수 b와 c 동시에 입력을 받습니다. 입력할때는 두 값 사이에 공백을 주면 각각 변수 b와 c에 나누어 저장됩니다. 또는 하나 입력 후 엔터키를 누르면 두번째 입력을 기다리는 식입니다. 

 

 세번째 char형 단일 문자 변수 e와 char형 문자열 변수 str에 입력을 받습니다. 입력할때는 역시 두 값 사이에 공백으로 구분을 주면 되며, 뒤의 문자열 변수에는 공백이 있어서는 안됩니다. 또한 문자열 변수에는 '&'를 붙이지 않습니다. 문자열 변수는 '배열' 이라는 것으로 이는 실제로는 '주소' 이기 때문인데, 역시 '배열'과 '포인터'를 알아볼때 같이 설명하겠습니다. 일단은 '문자열 변수'에는 '&'를 붙이지 않는다는 것만 기억해 두시기 바랍니다.

 

 

 2. 입력문의 적용

  

 위에서 여러 입력문에 대해 알아보았습니다. 그러면 이것을 가지고 성적관리 프로그램 'Grade Manager'를 업그레이드 해 보겠습니다. 먼저 이름과 점수들을 입력 받아 봅시다.

 

printf("이름을 입력하세요 : ");

scanf("%s", name);

printf("국어점수를 입력하세요 : ");

scanf("%d", &scoreKOR);

printf("수학점수를 입력하세요 : ");

scanf("%d", &scoreMAT);

printf("영어점수를 입력하세요 : ");

scanf("%d", &scoreENG);

printf("과학점수를 입력하세요 : ");

scanf("%d", &scoreSCI);

 

 이름은 문자열 변수이기 때문에 '&'를 붙여주지 않았고, 나머지는 붙여 주었습니다. 지난시간까지 만든 코드에 위의 코드를 '총점 계산' 위에 넣고 실행해보겠습니다.

  


 다음과 같이 정상적으로 입력을 받아 계산하여 잘 처리된 것을 볼 수 있습니다. 그런데 비주얼 스튜디오 2015의 아래 출력창을 보면

  

 

 다음과 같이 왠지 'Warning'이 많이 떠 있습니다. 프로그램 동작은 잘 되지만 뭔가 찜찜하고 혹시 애러가 나지 않을까 걱정도 될텐데요. 저 메시지는 대략 'scanf()'는 안전하지 않으니 'scanf_s()'를 쓰라는 이야기입니다. 이것은 gets()를 설명할때 이야기한 내용과 같습니다. 그래서 scanf_s()를 사용하는 것이 여러모로 좋습니다.

 

scanf_s("서식문자", 변수, ... 변수);

 

 이와같이 기본은 scanf()와 같은 방식으로 사용합니다. 여기서 문자 변수의 입력을 받을때만 변수의 크기를 넣어주게 됩니다. 예를들어

 

int a, b;

scanf_s("%d %d", &a, &b);

 

char c;

char str[80];

scanf_s("%c %s", &c, 1, str, sizeof(str));

 

int d;

char str2[80];

scanf_s("%d %s", &d, str2, sizeof(str2));

  

 첫번째는 scanf()와 사용법이 같고, 두번째, 단일문자와 문자열의 경우 변수 뒤에 크기를 넣어줘야 합니다.  세번째, int형과 문자열을 같이 써본 예입니다.

 

 이제 해당 부분을 다음과 같이 변경해줍니다.

 

printf("이름을 입력하세요 : ");

scanf_s("%s", name, sizeof(name));

printf("국어점수를 입력하세요 : ");

scanf_s("%d", &scoreKOR);

printf("수학점수를 입력하세요 : ");

scanf_s("%d", &scoreMAT);

printf("영어점수를 입력하세요 : ");

scanf_s("%d", &scoreENG);

printf("과학점수를 입력하세요 : ");

scanf_s("%d", &scoreSCI);

  

 이제 컴파일을 다시 해보면 'Warning'이 뜨지 않는 것을 볼 수 있습니다.

 

 다음은 성적에 대한 평가를 추가로 넣어보겠습니다. 빨간 부분을 추가해 봅시다.

 

#include <stdio.h> 

 

void main()

{

char name[20] = "홍길동";   // 이름

char grade = 'B';                 // 등급

int scoreKOR = 80;              // 국어점수

int scoreMAT = 75;              // 수학점수

int scoreENG = 86;              // 영어점수

int scoreSCI = 92;               // 과학점수

char comment[200];        // 평가

 

int scoreTotal = 0;            // 총점

float scoreAverage = 0.0F;       // 평균

 

scanf_s("%s", name, sizeof(name));

printf("국어점수를 입력하세요 : ");

scanf_s("%d", &scoreKOR);

printf("수학점수를 입력하세요 : ");

scanf_s("%d", &scoreMAT);

printf("영어점수를 입력하세요 : ");

scanf_s("%d", &scoreENG);

printf("과학점수를 입력하세요 : ");

scanf_s("%d", &scoreSCI);

 

printf("평가를 입력하세요 : ");

gets_s(comment, sizeof(comment));

 

// 총점 계산

scoreTotal = scoreKOR + scoreMAT + scoreENG + scoreSCI;

// 평균 계산

scoreAverage = (float) scoreTotal / 4;

 

// 화면 출력

printf("%s의 성적\n", name);

printf("국어 점수 : %d\n", scoreKOR);

printf("수학 점수 : %d\n", scoreMAT);

printf("영어 점수 : %d\n", scoreENG);

printf("과학 점수 : %d\n", scoreSCI);

printf("총점 : %d\n평균 : %.1f\n", scoreTotal, scoreAverage);

printf("평가 : %s\n", comment);

}

 

 실행을 한번 해봅시다.

  


 뭔가 동작이 이상합니다. 평가 부분 입력이 그냥 지나가 버리네요. 이런 현상이 발생하는 이유는, 입력되는 내용을 변수로 저장하기 전에 임시로 '입력 버퍼' 라는 곳에 저장하게 되는데, 이곳에 '\n'이 남아 있기 때문입니다. 그래서 scanf()문 뒤에 gets()문을 쓰지 말라고 권장하기도 합니다. 지금처럼 할수없이 써야 할 경우는 약간의 꼼수로 다음과 같이 고쳐서 버퍼를 비우면 됩니다.

 

getchar();

printf("평가를 입력하세요 : ");

gets_s(comment, sizeof(comment));

 

 getchar()를 써서 버퍼에 있는 '\n'을 가져오고 어떤 변수에도 저장하지 않고 넘어갔습니다. 자 이제 실행을 다시 해봅시다.

  


 잘 나옵니다. 아까처럼 평가 부분도 잘 입력이 되었습니다.

 

 다음은 이번시간에 수정한 최종 소스 코드입니다.

 

#include <stdio.h> 

 

void main()

{

char name[20] = "홍길동";   // 이름

char grade = 'B';                 // 등급

int scoreKOR = 80;              // 국어점수

int scoreMAT = 75;              // 수학점수

int scoreENG = 86;              // 영어점수

int scoreSCI = 92;               // 과학점수

char comment[200];        // 평가

 

int scoreTotal = 0;            // 총점

float scoreAverage = 0.0F;       // 평균

 

scanf_s("%s", name, sizeof(name));

printf("국어점수를 입력하세요 : ");

scanf_s("%d", &scoreKOR);

printf("수학점수를 입력하세요 : ");

scanf_s("%d", &scoreMAT);

printf("영어점수를 입력하세요 : ");

scanf_s("%d", &scoreENG);

printf("과학점수를 입력하세요 : ");

scanf_s("%d", &scoreSCI);

 

getchar();

printf("평가를 입력하세요 : ");

gets_s(comment, sizeof(comment));

 

// 총점 계산

scoreTotal = scoreKOR + scoreMAT + scoreENG + scoreSCI;

// 평균 계산

scoreAverage = (float) scoreTotal / 4;

 

// 화면 출력

printf("%s의 성적\n", name);

printf("국어 점수 : %d\n", scoreKOR);

printf("수학 점수 : %d\n", scoreMAT);

printf("영어 점수 : %d\n", scoreENG);

printf("과학 점수 : %d\n", scoreSCI);

printf("총점 : %d\n평균 : %.1f\n", scoreTotal, scoreAverage);

printf("평가 : %s\n", comment);

}

 

 이렇게 우리는 사용자의 입력을 받아 값을 저장하고 출력할 수 있게 되었습니다. 다음 시간에는 조건에 따라 다른 처리를 할 수 있는 '조건문' 에 대해 알아보도록 하겠습니다.


댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30