오늘은 2장을 끝내는 날!!
출력하기, 입력받기, 그리고 경찰 조서 쓰기 프로그램을 실제로 작성해 본다.
가장 먼저 배우는 내용은
printf()를 사용해 화면에 내용을 출력하는 것!
우선 다음과 같이 예제 코드를 작성했다.
#include <stdio.h>
int main(void) {
int add = 3 + 7;
printf("3 + 7 = %d\n", add);
return 0;
}
우리가 의도한 대로 3+7의 값인 10이 변수 add에 저장되었다.
따라서 결과가 3+7=10이라는 계산식의 형태로 출력되었다.
하지만, 변수를 사용하지 않고도 같은 결과를 얻을 수 있다!
#include <stdio.h>
int main(void) {
// int add = 3 + 7;
// printf("3 + 7 = %d\n", add);
printf("%d + %d = %d\n", 3, 7, 3 + 7);
return 0;
}
직전의 실습과 결과가 같다는 것을 확인할 수 있다.
%d를 총 세 번 사용했는데, 이는 정수형 값을 총 세 번 받겠다는 의미이다.
" ", 뒤에 적은 값이 순서대로 들어가게 된다.
지금까지 배운 내용을 요약하자면 이렇다.
printf()를 사용해 변수의 값을 출력할 때는 서식 지정자를 사용하고,
쉼표 다음에 값을 가져올 변수의 이름을 적는다.
서식 지정자는 변수의 자료형에 따라 달라지고,
출력할 값이 여러 개라면 서식 지정자 역시 출력할 값의 수만큼 적어야 한다.
서식 지정자는 띄어쓰기로, 변수는 쉼표로 구분한다.
printf("서식지정자 서식지정자 ... \n", 변수명1, 변수명2, ...);
다음으론 값을 입력받는 방법에 대해 알아본다.
입력을 받을 때에는 scanf() 함수를 사용한다. 이는 키보드로 값을 입력받아 저장하라는 의미다.
scanf()를 이용하면 키보드로 값을 입력받아 변수에 넣을 수 있다.
+) scanf()에는 입력 크기에 제한이 없기 때문에, 지정된 크기보다 더 많은 양의 입력을 받는
버퍼 오버플로(buffer overflow)라는 메모리 문제가 발생할 수 있다.
이를 보완하기 위해 scanf_s()를 사용하기도 한다.
scanf_s()가 입력 값의 크기를 저장한다는 것 외에 둘 사이에 차이는 없고, 사용법도 거의 같다.
scanf()를 사용해 다음과 같은 예제를 작성했다.
#include <stdio.h>
int main(void) {
int input;
printf("값을 입력하세요: ");
scanf_s("%d", &input); //입력받은 값을 input에 저장한다.
printf("입력값: %d\n", input);
return 0;
}
scanf() 함수에서 큰 따옴표 사이에 서식지정자 %d를 넣으면, 정수형 값을 입력받겠다는 의미다.
쉼표 뒤에는 값을 저장할 위치를 적는다. 예제에선 '&input'이라고 적었는데,
&는 메모리의 주소를 나타날 때 사용하는 기호다.
즉, &input은 input 변수가 할당된 메모리의 주소를 의미하고,
키보드로 입력받은 값을 이 주소에 넣으라는 뜻이 된다.
마지막으로, input을 출력하는 printf()함수를 통해
입력한 값이 변수 input에 잘 저장되었다는 것을 확인할 수 있다!

여러 값을 동시에 출력할 수 있던 printf()와 마찬가지로,
scanf() 역시 동시에 여러가지 값을 입력받을 수 있다.
#include <stdio.h>
int main(void) {
int one, two, three;
printf("정수 3개를 입력하세요: ");
scanf_s("%d %d %d", &one, &two, &three);
printf("첫 번째 값: %d\n", one);
printf("두 번째 값: %d\n", two);
printf("세 번째 값: %d\n", three);
return 0;
}
이 코드는 총 세 개의 정수 값을 입력받는데, 정수와 정수 사이는 스페이스를 통해 구분한다.
출력 결과를 통해 입력한 값이 세 변수에 모두 잘 저장되었다는 것을 알 수 있다.
마지막으론 문자를 입력받아 본다.
문자에는 크게 문자와 문자열의 두 가지 종류가 있는데,
문자는 한 글자, 문자열은 여러 문자의 모임을 의미한다.
이러한 문자나 문자열은 문자형 변수에 저장하고,
문자형 변수를 선언할 때는 char 라는 자료형을 사용한다.
또한, 값이 문자일 경우에는 작은 따옴표(' ')를 사용해 표시한다.
char 변수명 = '문자';
문자열은 값에 여러 문자가 한번에 들어가기 때문에, 일반 변수가 아닌 배열을 사용한다.
char str[256];
이는 문자를 저장하는 문자형 변수를 256개 생성한다는 뜻이다.
대괄호에 넣은 숫자의 크기 만큼 공간을 가진 변수를 만든다.
문자는 서식지정자로 %c를, 문자열은 %s를 사용한다.
또, 문자열의 위치를 지정할 때에는 & 없이 변수명만을 입력하면 된다.
위를 참고해서 다음과 같이 예제문을 작성했다.
#include <stdio.h>
int main(void) {
char str[256];
scanf_s("%s", str, sizeof(str));
printf("%s\n", str);
return 0;
}
위의 예제 코드를 실행하면 가장 먼저 빈 화면이 나오는데, 여기에 원하는 문자열을 입력한다.
단, 중간에 space를 누르면 입력값이 구분되어 뒷부분은 출력되지 않으니 유의한다.
문자열을 입력한 후 Enter를 누르면 입력한 글자가 그대로 출력된다!
이를 통해 문자열이 변수에 잘 저장됐음을 알 수 있다.
scanf_s()의 안에 sizeof()라는 연산자를 추가로 작성했는데,
scanf_s() 함수를 사용해 문자열을 입력받기 위해선 문자열의 크기를 미리 명시해야만 한다.
scanf()와 scanf_s()의 차이 중 하나다.
위 코드에서 str은 256개의 메모리 공간을 만들었기 때문에,
256보다 큰 문자가 들어오면 문제가 발생할 수 있다.
따라서 sizeof() 연산자를 사용해 str 변수의 크기만큼의 문자만 받겠다 선언해주어야 한다.
sizeof() 연산자는 () 안에 넣은 변수, 자료형, 배열 등이
메모리 공간을 얼마나 차지하는지를 바이트Byte 단위로 알려주는 연산자다.
sizeof(변수명/배열명/자료형)
p. 61
1분 퀴즈
문자열 2개를 입력받아 출력하는 코드를 작성해 보세요.
#include <stdio.h>
int main(void) {
char str[256];
scanf_s("%s", str, sizeof(str));
printf("%s\n", str);
scanf_s("%s", str, sizeof(str));
printf("%s\n", str);
return 0;
}
위에서 작성한 코드를 똑같이 한 번 더 붙여넣기 했다.
첫 번째 문자열을 입력받은 후 결과를 출력하고, 또다시 문자열 하나를 입력받는다.
뭔가 다른 방식으로 작성해야 할 것 같기도 하고...?
근데 이렇게 작성해도 일단 문제는 없는 것 같다
이렇게 작성해도 될 것 같기도 하고
#include <stdio.h>
int main(void) {
char str[256], str2[256];
scanf_s("%s", str, sizeof(str));
printf("%s\n", str);
scanf_s("%s", str2, sizeof(str2));
printf("%s\n", str2);
return 0;
}
순서를 바꿔서 입력입력, 출력출력으로 작성해도 될 것 같기도 하고

생각이 점점 많아진다...
마지막으로 2장에서 배운 것들을 모두 합쳐 경찰 조서 쓰기 프로젝트를 진행하게 되는데,
나는 내가 얼마나 알고 있는지 확인도 할 겸
64쪽의 실행 결과만 보고 나머지를 직접 작성해 보기로 했다!
이런 실행 결과를 얻어야 한다.
이름이 뭐예요? 나도코딩
몇 살이에요? 20
몸무게는 몇 kg이에요? 65.5
키는 몇 cm예요? 175.2
어떤 범죄를 저질렀어요? 무단횡단
--- 범죄자 정보 ---
이름: 나도코딩
나이: 20
몸무게: 65.5
키: 175.2
범죄명: 무단횡단
이름과 범죄명은 문자열로, 나이는 정수형 변수로,
몸무게와 키는 실수형 변수로 입력을 받고 소수점 두 번째 자리에서 반올림되게끔 하면 될 것 같다!
↓ 해서 아래와 같은 코드를 작성했다 ↓
#include <stdio.h>
int main() {
int age;
float height, weight;
char name[5], crime[256];
printf("이름이 뭐예요? ");
scanf_s("%s", name, sizeof(name)); //이름 입력받음
printf("몇 살이에요? ");
scanf_s("%d", &age); //나이 입력받음
printf("몸무게는 몇 kg이에요? ");
scanf_s("%f", &weight); //몸무게 입력받음
printf("키는 몇 cm예요? ");
scanf_s("%f", &height); //키 입력받음
printf("어떤 범죄를 저질렀어요? ");
scanf_s("%s", crime, sizeof(crime)); //범죄명 입력받음
//아래로 내용 출력
printf("\n\n---범죄자 정보---\n\n");
printf("이름 : %s\n", name);
printf("나이 : %d\n", age);
printf("몸무게 : %.1f\n", weight);
printf("키 : %.1f\n", height);
printf("범죄명 : %s", crime);
return 0;
}
의도한 대로 잘 출력됐다~!
아쉬운 점은 양식에 맞지 않게 입력할 경우 프로그램이 고장 나 버린다는 점?
이름을 다섯 글자로 설정했는데 이름 입력이 이보다 길거나
나이에 소수점을 입력하면 프로그램이 바로 고장 나 버린다 ㅋㅋ
다음 장의 내용인 반복문의 내용을 배우면 아마 이런 부분도
개선할 수 있지 않을까 싶음!!
올바르지 않은 입력은 재입력하게끔 한다던지 하는 방식으로...
아무튼 오늘도 많이 배웠다 ^__^
'Programming > C, C++' 카테고리의 다른 글
코딩 자율 학습단 6일차 - 조건문과 break (1) | 2024.06.30 |
---|---|
코딩 자율 학습단 5일차 - 이중 반복문 (0) | 2024.06.21 |
코딩 자율 학습단 4일차 - 반복문 (0) | 2024.06.21 |
코딩 자율 학습단 2일차 - 변수, 상수 (0) | 2024.06.18 |
코딩 자율 학습단 1일차 - 첫번째 C 프로그램 작성하기 (0) | 2024.06.17 |