본문 바로가기
ProgrammingLanguage/C언어

C언어 | 콘솔창 출력위치 변경, GotoXY, COORD, SetConsoleCursorPosition, GetStdHandle(STD_OUTPUT_HANDLE), windows.h

by 씽쌩쏭 2021. 2. 21.
728x90

✅ 오늘의 문제 : 계단 만들기

 

어떠한 양수를 입력받은 뒤, 그 양수와 같은 층의 계단을 만들어보세요

 

  • GotoXY 함수만을 사용하세요

 

(코뮤니티 모각코 과정 中 출제되어 푼 문제입니다.)

 


콘솔창의 출력 위치 변경하기

 

#include <windows.h>

 

먼저 <windows.h> 헤더 파일을 include 시켜줌!

<windows.h> 헤더파일 내에는 "윈도우 개발자들이 필요한 모든 매크로와 함수들"을 포함하고 있음

즉, "콘솔의 위치를 지정할 수 있는 함수"를 포함하고 있다!

 

그럼 콘솔의 출력 위치를 변경하는 함수를 만들어봅시다!

 

보통 GotoXY 라는 이름으로 작성하는, 널리 퍼진 함수 형태임 !!

 

Void GotoXY(int x, int y)
{
    COORD Pos;
    Pos.X = x;
    Pos.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}

 

자...이제 GotoXY 함수를 하나하나 뜯어서 분석해보겠슴다

 

우선 첫째 줄에 있는 COORD는 무엇일까요?

 

COORD

 

COORD의 실제 형태: 

 

typedef struct _COORD {
    SHORT X;
    SHORT Y;
} COORD, *PCOORD

 

COORD 라는 구조체는 선언되어 있는 x, y 값을 저장하는 역할!

 

SetConsoleCursorPosition

 

BOOL WINAPI SetConsoleCursorPosition(
    _In_ HANDLE hConsoleOutput,
    _In_ COORD dwCursorPosition
);

 

이 함수는 "콘솔의 핸들 값"과 "좌표값"을 받아서, 해당 위치로 콘솔의 커서를 이동시킴!

콘솔의 핸들값이란, 쉽게 말해 콘솔이 가지는 ID를 말합니당

 

 

GetStdHandle(STD_OUTPUT_HANDLE)

 

콘솔의 ID는 어떻게 구할까요

아래와 같이 리턴받을 수 있음!

 

GetStdHandle(STD_OUTPUT_HANDLE)

 

 


 

문제 풀이

 

[초안]

 

//어떠한 양수를 입력 받은 뒤, 그 양수와 같은 층의 계단을 만들어 보세요.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>

void GotoXY(int x, int y)
{
	COORD Pos;
	Pos.X = x;
	Pos.Y = y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}

int main() {

	int x = 0, y = 1;
	int n; // 층 수
	
	printf("양수를 입력하세요: ");
	scanf("%d", &n);

	for (int i = 0; i < n; i++) { //층 반복
		GotoXY(x, y);
		printf("ㄱ");
		x++; y++;
	}

	return 0;
}

 

x, y 좌표를 어떻게 증가 시킬 지 고민하다 x, y라는 변수를 main 함수에 추가시켜 썼는데,

굳이 저렇게 쓸 필요 없이 반복문 내에서 x를 i로, y를 i + 1로 적는 게 더 깔끔할 것 같다고 조언해주심!

 

그리고 GotoXY함수 형태는 항상 저렇게 쓰이는 건지 궁금해서 여쭤봤더니,

보통 저런 형태로 쓴다고 함! 불필요한 코드를 최소화하고, 필요한 부분만 취한 형태!!

 

조언해주신 걸 바탕으로 수정...

 

//어떠한 양수를 입력 받은 뒤, 그 양수와 같은 층의 계단을 만들어 보세요.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>

void GotoXY(int x, int y)
{
	COORD Pos;
	Pos.X = x;
	Pos.Y = y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}

int main() {

	int n; // 층 수
	
	printf("양수를 입력하세요: ");
	scanf("%d", &n);

	for (int i = 0; i < n; i++) { //층 반복
		GotoXY(i, i + 1);
		printf("ㄱ");
	}

	return 0;
}

 

와 이렇게 되는 건 생각도 못했다...!

x++;이랑 y++; 까지 사라지는군

 

아주만족ㅠㅠ

 

 

출력 시!