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

쉽지않네님의 프로필 이미지
쉽지않네

작성한 질문수

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

6.1 while 반복 루프에서 scanf()의 반환값 사용하기

한 번에 여러 개의 값을 입력했을 때에 관해 질문이 있습니다.

해결된 질문

작성

·

471

2

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	// TO DO : q가 입력될 때까지의 입력받은 모든 정수 합 출력

	// 1. 준비
	int input = 0;	// 입력을 저장할 변수
	int sum = 0;	// 합계를 저장할 변수
	int status = 0;	// scanf의 반환값(입력값의 갯수)을 저장할 변수

	// 2. 입력
	printf("Enter an integer (q to quit) : ");
	status = scanf("%d", &input);
	// scanf()의 동작
	// 입력받은 값이 형식 지정자의 형식과 일치할 경우 입력으로 취급하여 입력값의 갯수 반환
	// 입력받은 값이 형식 지정자의 형식과 일치하지 않을 경우 입력으로 취급하지 않으며 0을 반환

	// * 성공적으로 스캔된 입력의 갯수 확인용
	printf("%d\n", status);

	// 3. 반복
	while (status == 1) { // scanf()의 반환값이 1일 때만 반복
		// 현재 루프에 대한 처리
		sum = sum + input;
		// 다음 루프
		printf("Enter next integer (q to quit) : ");
		status = scanf("%d", &input);
	}

	// 4. 출력
	printf("SUM = %d\n", sum);
};

 

1 2를 입력하니

"Enter next integer (q to quit) : " 문장이 2개 출력되었지만

1 2를 모두 입력으로 인식했는지

바로 sum을 출력했을 때 3이 출력됬습니다.

 

다음으로 1 2 3 4 5를 입력하니

"Enter next integer (q to quit) : " 문장이 5개 출력되었지만 sum을 출력해보니 10이 출력됬습니다.

 

저는 scanf의 형식 지정자와 값을 저장할 변수를 하나만 지정했는데 왜 5개 입력에 대해서 5번 루프를 실행하고 sum의 값이 정상적으로 출력되었는지 잘 이해가 안되서 질문 드립니다..

 

그리고 scanf()는 입력한 값의 형식이 형식 지정자의 형식과 일치할 경우 스캔에 성공한 입력의 갯수를 반환한다고 배웠는데

중간에 scanf의 반환값을 printf()해서 성공적으로 스캔된 입력의 갯수를 확인해 봤을 때 형식에 맞는 변수를 여러 개 입력해도 1이 출력되던데 이유가 뭘까요,,??

답변 1

2

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

 

표준 입력 버퍼 라는 개념 때문입니다.

 

  • scanf() 함수에 하나의 형식 지정자만 주어졌는데 여러 개의 입력을 인식하는 이유
    : scanf() 함수는 표준 입력 버퍼 에서 입력을 읽습니다.
    만약, "1 2 3 4 5" 와 같이 공백으로 구분된 숫자를 입력하고 엔터를 누르시면, 해당 문자들은 공백을 모두 포함하여 입력 버퍼에 저장됩니다.


    이후, 성공적으로 읽어들인, 즉, 형식지정자와 일치하는 데이터를 읽어들인 후에는 해당 부분을 버퍼에서 제거합니다.


    이후, 반복문 내의 scanf() 함수에서도 위와 같은 동작이 반복됩니다.

    따라서, 첫 입력으로 "1 2 3 4 5" 와 같이 여러개의 숫자를 공백으로 구분하여 입력하였을 때, 해당 데이터는 표준 입력 버퍼 에 저장되며, 각 단계의 scanf() 함수는 서식지정자와 일치하는 데이터를 버퍼로부터 읽어들이고, 나머지 부분들은 그대로 버퍼에 남겨둔 상태로 그 다음 scanf() 함수들이 작동하면서 작성하신 프로그램이 실행되는 것입니다.

     

 

  • 여러 숫자를 입력해도 scanf() 함수의 반환 값이 항상 1 인 이유


    : scanf() 의 반환값은 성공적으로 스캔된 항목의 수입니다, 항목의 실제 값이 아닙니다.


    형식 문자열에 하나의 형식 지정자(%d)만 있기 때문에, scanf() 함수는 한 번에 하나의 항목만을 스캔할 수 있습니다.
    따라서, "1 2 3" 을 입력하시면, 첫 번째 scanf() 함수 호출은 "1" 을 성공적으로 스캔하고, 1 을 반환합니다. 다음 홀출은 "2" 를 스캔하고 1 을 반환하는 식으로 계속됩니다.



    만약, scanf() 호출에 여러 형식 지정자가 있었다면, 예를 들어 scanf("%d %d", &num1, &num2); 와 같이, 두 숫자 모두 성공적으로 스캔되면 2 를 반환합니다.

 

  • "Entering next integer (q to quit):" 문장이 여러 번 출력되는 이유
    : 첫 번째 답변에서의, 표준 입력 버퍼scanf() 함수의 동작 방식에 대한 내용과 연관이 있습니다.
    반복문 내의 scanf() 함수가 데이터가 남아 있는 표준 입력 버퍼 로 부터 데이터를 읽어들이며 반복되어 해당 문구가 반복 횟수 만큼 출력되는 것입니다.


요약하자면, 공백으로 구분된 여러 숫자를 입력했을 때, scanf() 함수가 반복문의 각 반복에서 숫자를 하나씩 입력 버퍼로부터 읽기 때문에 예상한 합계를 얻게 되는 것입니다.

프롬프트 문구가 여러 번 출력되는 이유는 반복문이 입력한 각 숫자마다 반복되기 때문입니다.

그리고, scanf() 함수가 작성하신 프로그램에서 항상 1 을 반환하는 이유는 하나의 형식 지정자만 사용하셨기 때문입니다.

 

표준 입/출력 버퍼 와 관련되어서는, 현재 수강하고 계시는 섹션 6 반복문 의 중후반부에 걸쳐서 소개되며 학습을 진행하게 되시고, 섹션 8강의 8.1 입출력 버퍼 에서 보다 자세하게 학습을 하시게 됩니다.

쉽지않네님의 프로필 이미지
쉽지않네
질문자

정말 상세한 답변 너무 감사드립니다!!

더 열심히 공부하겠습니다!!!!!!

쉽지않네님의 프로필 이미지
쉽지않네

작성한 질문수

질문하기