우선 이미 맞았습니다를 받았음에도 불구하고 이 코드는 위험한 코드임을 미리 알려드립니다.
변수가 실제로 메모리상에 올라갈때 선언된 순서가 실제 배치된 순서와 연관이 있습니다.
제가 아래 첨부한 코드로 12를 입력으로 실행시켜보시기 바랍니다.
만약 결과가 제대로 뜬다면 이 싸이트에 들어가서 C++17이나 14로 실행시켜보시기 바랍니다.
분명 이상한 결과가 뜰 텐데 그 이유는 str입력 받을때 마지막에 널문자를 넣어야하기 때문에
길이 3인 char 배열이 필요합니다. 그런데 선언된 배열의 길이는 2개이기 때문에 범위를 초과하여 b값을 오염시키면서 b값의 일부에 0을 넣습니다.
그런데 이것은 아마 컴파일러마다, C++ 버전마다 다른 것 같습니다.
위 첨부한 링크에서 C++20으로 실험해본 결과 char 배열의 최대길이를 컴파일러가 확인하고 초과되지 않는 범위까지만 읽습니다.
그렇다면 이제 질문자님의 코드를 정확히 분석하자면,
기존 5번째 줄에서 char str[2]로 쓴 코드는 그 이후에 선언되어 있는 변수 cube의 값을 변경시켰을 것으로 생각됩니다.
(C++ 템플릿의 변수는 복잡해서 정확히 어떻게 변경시켰는지 알기 어렵지만 cin >> str때 다른 변수를 오염시킵니다)
그렇다면 오히려 왜 20번째 줄에 str[2]로 선언했을때는 맞았는지 분석해야합니다.
20번째 줄에 있는 str 뒤에는 다른 변수가 없습니다.
따라서 잠시 오염시켜도 어차피 다른 변수가 생성되었을때(함수가 호출되었을때 지역변수가 해당 위치에 생성됩니다.)
가비지 값이 있을 것이라고 생각하고 코딩하셨을 테니 맞았습니다가 떴을 것입니다.
그래도 배열의 범위를 벗어나 작동하는 코드는 위험한 것 같습니다.
널 문자를 고려하셔서 늘 배열을 한칸 많이 선언해주시면 좋을 것 같습니다.
4z7l 2년 전
구현 알고리즘은 생략하겠습니다 거기서 틀린게 아니라서..
일단 게시판의 반례는 다 맞고 테케도 맞는데 50%에서 틀렸습니다가 계속 떴습니다.
디버깅 2시간째라 포기상태로 그냥 변수 선언 위치만 바꿨는데 맞았습니다 떴어요..
main함수만 올려보겠습니다.
저랑 같은 문제인지 한번 확인해보시고 이유 아시는분은 알려주세요..ㅠ c++ 문자열 관련 문법 때문인거같은데..
주석처리한 5번째 줄과 20번째줄만 보시면 됩니다
+)
5번째 줄에서 char cmd[3]으로 선언하는 것도 맞았습니다 떴습니다
입력 관련해서 빠삭한분.. 논리적으로 설명해줄부 구합니다..ㅠㅠ