boj 1439번 문제를 통해 접하게된 컴파일러상의 차이로 보여지는 string 의 -1번째 인덱스의 접근.

boj 1439번 문제의 코드를 작성해서 맥북상에서 실행시켜보았을때 모두 정상적으로 동작하고 답도 잘 나와서 

boj에 제출을 했는데 정상적으로 성공하였습니다를 받을 수 있었다. 그러다가 코드를 유심히 보는데 내 코드의 경우 int=0부터 시작하는데 접근이 st[i-1]의 경우에 st[-1]이 되어서 이런 경우는 잘못된 접근이라고 생각했는데, 혹시나 c++17의 경우 달라진것이 있는것인가 싶어서 c++14, 11, 98 등으로 낮추면서 모두 제출해보아도 제출에 성공하였다. 

#include <bits/stdc++.h>
using namespace std;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    string st;
    cin>>st;
    int stlen=st.size();
    int cnt_0=0;
    int cnt_1=0;
    for(int i=0; i<stlen;i++){
        if(st[i-1]!=st[i]&&st[i]=='1') cnt_1++;
        if(st[i-1]!=st[i]&&st[i]=='0') cnt_0++;
    }
    cout<<min(cnt_1,cnt_0);
}

 

그래서 분명 내가 지금까지 접했던 윈도우에서 visual studio 2019를 이용한 환경에서는 잘못된 인덱스 접근은 런타임 에러를 보여주었었는데, 왜 맥북에서는 잘되고, 제출도 잘될까 싶어서 그램을 꺼내서 visual studio 2019상에서 코드를 실행하고 수열을 입력하니까

역시나 런타임 에러를 접하게 되었다. 

이 경우 예상으로는 맥북과 boj의 경우는 gcc이고, visual studio 2019의 경우는 msvc이기 때문에 오는 차이라고 생각되었다. 

gcc c++ string -1 index 등으로 검색해보아도 관련된 딱 들어맞는 내용들을 볼 수 없어서 일단 이에 대한 검색은 지속하지는 않겠으나, 

애초부터 이런식으로 gcc를 사용하는 내 맥북에서나 boj에서 통과를 하더라도, 의미상 string의 -1번째 index 접근은 옳지 못한 접근이기 때문에 이런식의 코드를 짜지 않도록 경계하도록 하고 이런 방식의 코드가 되지 않도록 인덱스가 0일때 i-1을 활용하는 코드의 예외처리를 꼭 신경쓰도록 하자. 이번 코드 작성의 경우 예외처리를 신경쓰지 못하였는데, 지속적으로 정상적으로 코드가 실행되었고, 그리고 제출 하여서도 정상적으로 통과하였기 때문에 뒤늦게 알아보게 된것 같다. 좋은 코딩습관을 들이도록 하자. 

 

 

#include <bits/stdc++.h>
using namespace std;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    string st;
    cin>>st;
    int stlen=st.size();
    cout<<st[-1]<<'\n';
    cout<<st[0]<<'\n';
}

 

참고로 위와 같은 코드를 작성해서 내 맥북에서 st[-1]에 접근했을때 어떤식의 출력 결과물이 나오는지를 확인하기 위해 코드를 실행하고 값을 123을 입력해보았을때, 

 

//123

//

//1

 

와 같은 결과물을 얻을 수 있었고, st[-1]의 내용 자체는 공백으로 출력되었다. 

 

  Comments,     Trackbacks