본문 바로가기
c++

[CPP00] Exercise 00: Megaphone

by SangHun_Brad 2022. 1. 26.

[CPP00] Exercise 00: Megaphone

c++의 표준 출력 스트림인 cout사용법 익히기

 

과제 내용

다음과 같이 작동하는 megaphone프로그램 구현.

$>./megaphone "shhhhh... I think the students are asleep..."
SHHHHH... I THINK THE STUDENTS ARE ASLEEP...
$>./megaphone Damnit " ! " "Sorry students, I thought this thing was off."
DAMNIT ! SORRY STUDENTS, I THOUGHT THIS THING WAS OFF.
$>./megaphone
* LOUD AND UNBEARABLE FEEDBACK NOISE *
$>

 

과제분석

  1. megaphone프로그램은 실행시에 argument를 받아서 대문자로 변환하여 출력을 한다.
  2. argument가 여러개일 경우 띄어쓰기없이 바로 이어서 출력을한다.
  3. argument가 0개일 경우 "* LOUD AND UNBEARABLE FEEDBACK NOISE *"를 출력한다.

 

megaphone.cpp

#include <iostream>

namespace	my_func
{
	char	to_upper(const char c)
	{
		if (c >= 'a' && c <= 'z')
			return (c - 32);
		else
			return (c);
	}
}

int	main(int argc, char **argv)
{
	int	i;

	if (argc == 1)
	{
		std::cout << "* LOUD AND UNBEARABLE FEEDBACK NOISE *" << std::endl;
		return (0);
	}
	argv++;
	while (*argv)
	{
		i = 0;
		while ((*argv)[i])
		{
			std::cout << my_func::to_upper((*argv)[i]);
			i++;
		}
		argv++;
	}
	std::cout << std::endl;
}

 

namespace

하나의 프로그램을 만들다 보면 수많은 구조체, 함수, 객체들을 선언하게 되는데요.
그런데 여러명의 개발자가 붙어서 작업을 하다보면 이름이 중복해서 선언하게 되는 경우가
발생할 수 있는데 이럴 때 충돌이 발생하는 것을 방지하기 위해 만들어진 것이 namspace!!

namespace 선언

namespace my_namespace
{
	함수, 클래스, 변수 등등
}

namespace 접근

1. my_namespace::요소이름 으로 선택적으로 명시하여 접근
2. using 키워드를 사용한 전역적인 접근
  • 위처럼 namespace를 명명하고 내부에 함수, 클래스, 변수를 정의할 수 있다.
  • 이렇게 namespace로 보호하면 같은 이름으로 외부에 선언되어있어도 충돌하지 않고 사용이 가능해진다.
  • 사용은 my_namespace::요소이름 으로 접근하여 사용이 가능하다.
  • using 키워드를 사용했을 때, 요소이름이 중복되는 경우에는 충돌이 날 수 있기 때문에 이번 과제에서도 지양하는 것 같다.
  • 이번과제에 사용할 std::cout 또한 표준 라이브러리의 std라는 namespace에 선언된 cout객체에 접근해 사용하는 것이다.

 

표준 출력 스트림 cout

cout 사용

#include <iostream>
std::cout << 요소;
  • c++구현체에서 표준출력 스트림을 사용하여 프로그램의 일반적인 출력 기능을 구현할 때 사용한다.
  • c언어의 printf와 비슷하게 내부에서 버퍼를 사용한다.
  • '<<'연산에 대해서 기본자료형들은 모두 오버로딩 되어 있기 때문에 printf와 다르게 서식지정자를 사용할 필요가 없이 출력이 이루어진다.

cout 버퍼를 비우는 경우

아래의 세 가지 경우에 대해서 cout은 화면에 버퍼에 저장한 내용을 출력하고 버퍼를 비운다.

  1. 버퍼가 가득 차 있을때
  2. 라이브러리가 표준 입력 스트림으로 입력 내용을 요청 받을 때 (ex std::cin >> input)
  3. 라이브러리에 명시된 코드를 입력받았을 때 (ex std::cout << std::endl;)