Programming/C++

[C++] 변수 초기화 안하면 발생하는 문제

IN.0 2023. 9. 10. 19:51
728x90
반응형

요즘 가끔 C++ 공부를 하고 있다.

certi ex 도전을 하고 싶은데 C랑 C++로 언어 제한이 있기 때문이다.

지금까지 코테를 파이썬 원툴로 풀고 다녔기 때문에 다른 언어로 알고리즘 풀이를 해본 적이 없어서 그런지, 생각지도 못한 부분들에서 계속 오류가 나온다.

(심지어 업무 시에 사용하는 java로도 코테로 활용 못한다.. 업무 할 때는 모르는 게 있으면 구글링 하고, 문법을 외우거나 하진 않기 때문에!)

이번에도 기초 문제 풀다가 변수 초기화 문제로 한참 애를 먹었다.


아래 a와 b의 차이가 뭔지 몰랐다.

char a[10];
char b[10] = "";

몰랐다기보단, 어렴풋이 알고는 있었지만 생각을 못했다는 게 더 맞겠다.

파이썬은 변수를 정의하면 알아서 초기화해 준다.

그런데 C계열에서는 초기화를 하지 않으면 이상한 값이 들어가 있다.

즉, a는 빈값이 아니라 "f.g4_b!!$a" 머 이런 이상한 값이 들어있다고 보면 된다.

따라서 웬만하면 b처럼 선언과 동시에 초기화를 해주는 게 깔끔하다.


내가 풀었던 문제는 간단한 반복문이었다.

프로그래머스 - 문자열 반복 출력 문제

"abc 2" 이렇게 입력이 들어가면 "abcabc" 이렇게 출력하면 된다.

라이브러리 사용이 불가하기 때문에 정답 제출을 위한 입출력 빼고 #include 없이 구현하는 연습을 하다 보니, string을 사용하지 못하고 char[]를 사용했다.

일단 처음에 제출해서 통과한 코드는 아래와 같다.

#include <iostream>
using namespace std;

int main(void) {
    char str[100] = "";
    char answer[500] = "";
    int n;
    cin >> str >> n;
    int cnt = 0;
    for (int i=0; i<n; i++) {
        for (int j=0; j<100; j++) {
            if (str[j] == NULL) {
                break;
            }
            answer[cnt] = str[j];
            cnt++;
        }
    }
    
    cout << answer;
    return 0;
}

문자 제한은 10자 이내, 반복 제한은 5회 이내라서 str[10], answer[50]으로 구현했었는데 채점 데이터 상의 오류가 있다고 해서 길이를 늘렸다.

str과 answer를 처음엔 초기화하지 않고 정의만 했더니 계속 실패가 뜨더라고..

디버깅하면서 값을 찍어보니 내가 넣지도 않은 garbage 값이 들어있어서 그런 거였다.

물론 아래와 같이 바로 출력해 버리는.. 간단한 방법도 있었다.

#include <iostream>
using namespace std;

int main(void) {
    char str[100] = "";
    int n;
    cin >> str >> n;
    while (n--) {
        cout << str;
    }
    return 0;
}

이번 문제를 풀면서 변수 정의 시 초기화의 필요성에 대해 알게 되었다!

728x90
반응형