인프런 커뮤니티 질문&답변

Organ님의 프로필 이미지
Organ

작성한 질문수

홍정모의 따라하며 배우는 C언어

8.5 숫자와 문자를 섞어서 입력받기

질문 두 가지가 있습니다

작성

·

404

·

수정됨

2

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void display(char cr, int lines, int width);

int main()
{
	char c;
	int rows, cols;


	// 종료를 깔끔하게 하지 못한다
	// while(1)
	// {
	// 	scanf("%c %d %d", &c, &rows, &cols);
	// 	while(getchar() != '\n') continue;
	// 	display(c, rows, cols);
	// }

	printf("input one char and two int :\n");
	while ((c = getchar()) != '\n')
	{
		scanf("%d %d", &rows, &cols);

		display(c, rows, cols);
		printf("input another character and two int : \n");
		printf("press enter to quit.\n");
	}

	return 0;
}

 void display(char cr, int lines, int width)
{
	for(int i = 0; i < lines; i++)
		{
			for(int j = 0; j < width; j++)
			{
				printf("%c",cr);
			}
			printf("\n");
		}
}

첫 번째는 강의 5분쯤 밑에 코드로 내려와서 실행하시는데 처음에 * 3 5엔터 후 종료되는 것이 아닌 % 2 2를 이어서 하시는데 제 딴에는 똑같이 따라한 것 같은데 첫번째 엔터 후 종료가 되버립니다.

두 번째는 밑에 display함수에서 저는 printf를 사용했고 선생님은 putchar을 사용하셨는데 제 생각에는 별다른 차이가 없을 것 같고 첫 번째 문제를 만나기 전까지는 결과가 이상이 없어 괜찮을 거 같은데 혹시나 해서 그냥 짧게 쓰고자 하는 목적인지 질문합니다

 

답변 2

2

안녕하세요, 답변 도우미 Soobak 입니다.

두 질문이 서로 조금씩 연관이 되어 있는 질문 같아요!

1. 첫 번째 엔터 후 프로그램이 종료되는 이유
- 교수님께서 설명해주신 것 처럼, scanf() 함수는 줄바꿈 문자를 버퍼에 계속해서 남겨두게 됩니다. 따라서, 질문해주신 8.5 숫자와 문자를 섞어서 입력받기5:48 부분처럼 while (getchar() != '\n') continue; 부분과 같이, 버퍼에 남아있는 줄바꿈 문자들에 대한 처리가 필요합니다. 코드는 동일하게 작성하신 것이 맞지만, 교수님께서도 강의에서 약 1분 뒤 버퍼와 관련된 문제를 다루시므로 참고하시면 좋을 것 같습니다. 코드가 바로 종료되는 이유는 while() 문의 조건식의 getchar() 함수가 '버퍼에 남아있는 줄바꿈 문자' 를 읽어버리기 때문인 것 같습니다.


2. putchar() 함수와 printf() 함수의 차이
- 단순히 짧게 쓰기 위한 목적만은 아닙니다.
- 1번 질문에서 scanf() 함수와 getchar() 함수가 둘 다 입력을 받아오는 함수이지만 차이가 있었던 것과 같이, printf() 함수와 putchar() 함수 역시 차이가 있습니다.
- 여러가지 차이점들이 있지만, 지금은 학습하신 내용 중 8.1 입출력 버퍼 강의에서 교수님께서 소개해주신 내용, 즉, "putchar() 함수는 버퍼를 사용하지 않지만, printf() 함수의 경우 버퍼를 사용한다" 는 내용 정도만 이해하시면 좋을 것 같습니다.

 

추후 13. 파일 입출력 섹션에서 버퍼와 입출력 과정에 대하여 한번 더 공부하게 되실텐데요. 해당 섹션 이후에 입출력함수들과 버퍼에 대하여 조금 더 자세하게 찾아보시며 공부하는 것을 추천 드립니다. 그 때 쯤 다시 공부해보시면 더 많은 것을 이해하실 수 있을 것 같습니다.

답변을 작성하면서 질문자님이 꼼꼼하게, 잘 학습하고 계신 것이 느껴져서 인상 깊네요. 질문해주셔서 감사하고, 또 궁금하신 점 있으시면 편하게 댓글 남겨주세요. 감사합니다. 화이팅!!

Organ님의 프로필 이미지
Organ
질문자

감사합니다~~

마지막 putchar() 함수는 버퍼를 사용하지 않지만, printf() 함수의 경우 버퍼를 사용하지 않는다" 는 내용 정도만 이해하시면 좋을 것 같습니다. 이 부분은 printf함수의 경우 버퍼를 사용한다라고 이해하겠습니다

1

Organ님의 프로필 이미지
Organ
질문자

메인파일을 받아 제가 수정한 후 실행해봐도 한번하고 종료됩니다

Organ님의 프로필 이미지
Organ

작성한 질문수

질문하기