C++ 글자 출력, 프로그램 인자, 대문자로 변환.

CPP Module 00의 ex00가 요구하는 사항들이다.

글자 출력

#include <iostream>

int	main()
{
	std::cout << "Hello world" << std::endl;
	return 0;
}
  • iostream 헤더를 include.
  • std::cout에 << 연산자를 사용하여 표준 출력.
  • std::endl이 개행 문자를 가리킴. 마찬가지로 << 연산를 사용하여 표준 출력.
$ ./megaphone
Hello world

프로그램 인자

C와 동일하다.

#include <iostream>

int	main(int argc, char *argv[])
{
	for (int i = 0; i < argc; i++)
		std::cout << argv[i] << std::endl;
	return 0;
}
$ ./megaphone hello world
./megaphone
hello
world

문자열을 모두 대문자로 변환

문자 하나 (char)는 std::toupper 함수로 변환할 수 있다.
간단하게 C 스타일로 생각하면, 인자로 들어오는 char*형 문자열을 반복문 돌려서 std::toupper 한 다음, 출력하면 될 것 같다.

그러나 C++ 과제에 온 만큼, 최대한 C++ 스타일로 과제를 해결해보고 싶었다.
그래서 검색하던 도중, 아래와 같은 스택오버플로 질문 및 답변을 볼 수 있었다.

[]을 사용하여 C스타일로 하는 것도 물론 가능하지만, 두 가지를 알아야 한다.

  • 그 컨테이너에 [] 연산자가 구현되어 있어야 한다. (배열이면 상관 없음)
  • vector, 배열 처럼 순차적으로 데이터가 들어가있는 것이 보장되어 있어야 한다.

여기서는 우리는 배열 형태로 인자를 받기 때문에 상관이 없기야 하겠지만, 
적어도 나중을 대비해서 iterator를 활용하는 방법을 익혀두는 것이 좋겠다고 생각했다.

iterator를 사용하는 핵심은 세 가지다.

  • begin()
    • iterator의 시작
  • end()
    • iterator의 끝
  • * 연산자
    • 해당 위치의 요소를 얻음.

이를 사용해 std::string 에서 toupper을 활용하면 아래와 같이 쓸 수 있다.

std::string				str(input);
std::string::iterator	strit = str.begin();

while (strit != str.end())
{
	std::cout << static_cast<char>(std::toupper(*strit));
	strit++;
}

그래서 최종적으로 내 코드는 아래와 같은 형태가 되었다.

#include <iostream>
#include <string>

static void	print_upper(const char *input)
{
	std::string				str(input);
	std::string::iterator	strit = str.begin();

	while (strit != str.end())
	{
		std::cout << static_cast<char>(std::toupper(*strit));
		strit++;
	}
}

int	main(int argc, char *argv[])
{
	if (argc > 1)
	{
		for (int i = 1; i < argc; i++)
			print_upper(argv[i]);
	}
	else
		print_upper("* loud and unbearable feedback noise *");
	std::cout << std::endl;
	return 0;
}

테스트 결과, 과제의 예제와 동일하다.

./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 *

댓글

Designed by JB FACTORY