C++ 글자 출력, 프로그램 인자, 대문자로 변환.
- Development/42 Seoul
- 2021. 12. 11.
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 *
'Development > 42 Seoul' 카테고리의 다른 글
[ft_containers] vector (0) | 2021.12.17 |
---|---|
42 CPP Module 08 ex00에서, 반복문을 단 하나도 안쓰기 (직접 만든 함수로 STL bind1st, bind2nd 사용) (0) | 2021.12.11 |
[Minishell] 미니쉘 테스트 할만한거 (0) | 2021.12.11 |
C++ 컴파일을 위한 Makefile 준비 (0) | 2021.12.11 |
CPP Module 04 문제 메모 (0) | 2021.12.11 |