본문 바로가기
배운 것들 메모/따라 배우는 C언어

[홍정모의 따라하며 배우는 C언어] 6.1 while 반복 루프에서 scanf()의 반환값 사용하기

by 야속한 낭만 2024. 9. 12.

 

문제 푸는 과정

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	char i = 0;
	int value = 0;
	
	while (1)
	{		
		printf("Enter next integer\n");
		scanf("%d", &i);

		if (i == 'q')
		{
			printf("%d", value);
			break;
		}
		value = value + i;		
	}
	printf("%d", value);
}
  • 궁금한 점 - 첫 번째에 보면 Enter next integer가 아니라 Enter an integer로 출력되어있었는데. 이러면, 반복문 위에 구현해놨다는 건데, 첫 번째 변수를 어디서, 왜 받는 건지?
  • 오직 while문으로만 구현하기에는 어려워서

그래서 일단은 ‘합’에 대해서 초점을 맞추어서 q를 넣어서 종료되는 것은 없애기로 했다.

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int i = 0;
	int value = 0;
	
	while (1)
	{
		
		printf("Enter next integer\n");
		scanf("%d", &i);

		value = value + i;


		printf("The sum is %d\n", value);
	}
}

이렇게 구현하면 종료됐을 때 모든 합을 깔끔하게 보여주지는 않지만, 일단은 입력한 모든 수의 합이 더하게 끔 구현은 되었다.

이제 리터럴 q를 넣었을 때 함수가 종료되면서, 모든 합의 결과값을 넣어 주면된다.

그런데 내가 봤을 때, 종료되었을 때 모든 합의 결과값을 보여주는 것은 그냥 저 printf를 while문으로 밖으로 빼주면 될 것 같고.

문제는 ‘q’를 넣었을 때 어떻게 함수를 정지 시키는 가..?

%d 때문에 무한 루프가 생기는 것 같은데..

scanf에 %c나 %s로 다 교체해주면, 덧셈이 아마 안될 것으로 예상된다.

심지어 %c에서 숫자를 받는 것이 가능하다 해도 char은 255까지의 숫자 밖에 표현이 안되기 때문에 의미가 없다.

그래서 음수를 넣었을 때, 정상적으로 프로그램을 작동하도록 만들었다.

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int i = 0;
	int value = 0;
    
	while (i > -1)
	{
		printf("Enter next integer\n");
		scanf("%d", &i);	
		value = value + i;
	}
	printf("The sum is %d\n", value);
}
  • while문에 (i > 0)을 넣으면 그냥 입력도 필요 없이 while문이 종료가 되어서 어쩔 수 없이 -1을 넣었다.

어떻게든 되긴 했는데 하자가 하나가 있다.

음수를 넣으면 그 음수가 value = value + i;에

계산하고 나와서 결과 값이 그 음수 만큼 뺀 값이 나온다..

 

음.. 그렇게 생각을 하다가 번뜩! 생각났다.

마지막 부분에 그 음수 만큼 더해주면 되는거 아니야??

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int i2 = 0;
	int value = 0;
	while (i > -1)
	{
		printf("Enter next integer\n");
		scanf("%d", &i);	
		value = value + i;
	}
	value = value -(i);
	printf("The sum is %d\n", value);
}

 

결과는 잘 나오긴 한다..

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int num = 0;
	int sum = 0;
	int status;

	printf("Enter an integer (q to quit) : ");
	status = scanf("%d", &sum);

	while (status == 1)
	{
		sum = sum + num;
		
		printf("Enter next integer (q to quit) : ");
		status = scanf("%d", &num);

	}
	printf("sum = %d\n", sum);

	return 0;

}

이 코드는 홍정모 선생님이 짠 코드다.

일단 처음에 enter an integer을 왜 번거롭게 또 다른 변수에 넣을려고 했는지 이해가 안되었는데,

scnaf 반환 값을 응용해서 만든 것이다. 

 

즉, scanf에 글자가 들어가면 숫자밖에 인식이 안되서 0으로 인식되고(%s나 %c면 1로 인식할 것 같다), scanf에 하나의 숫자가 들어오면 1로 인식하는 점을 이용한 것이다.

 

나는 이거를 보고 진짜 감명을 받았다.

동등 연산자 Equality Operator

 

while(status == 1) 부분의 ‘==’은 왼쪽 좌변과 우변이 같은지 비교를 하는 것이다.

 

status == 1에서 status의 변수가 1이라면 이 표현식 그 자체가 1이 된다.

 

출처:  홍정모의 따라배우는 C언어

강의 외의 추가된 것들은 책 그리고 인터넷 조사해서 얻었음