• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

연습문제 질문

23.03.21 19:04 작성 조회수 284

1

아래와 같이 연습문제를 풀어봤는데요(16번째 줄 Ptractice-while 출력 다음부터).

16번째 줄 이전은 수업때 보여주신 출력 코드입니다.

visual studio 2019 x64 쓰고있는데, 제가 보는 출력화면에서는 강의대로 입력한 코드에서 마지막 \0이 출력 안되고, jack jack만 출력됩니다.

연습문제로 제가 구현한 코드도 jack jack만 출력되구요(마지막 \0 미출력) 컴파일러 버전에 따라 cout이 \0을 출력안하는 건가 싶은데 맞나요??

 

#include <iostream>

using namespace std;

int main() {

char name[] = "jack jack";

const int n_name = sizeof(name) / sizeof(name[0]);

char* ptr = name;

for (int i = 0; i < n_name; i++) {

cout << *(name + i);

}

cout << "--";

cout << endl << "----" << endl;

cout << "Practice - while" << endl;

int i = 0;

while (true) {

cout << *ptr;

++ptr;

if (*ptr == '\0') break;

}

cout << "--";

return 0;

}

답변 1

답변을 작성해보세요.

2

Soobak님의 프로필

Soobak

2023.03.21

안녕하세요, 답변 도우미 Soobak 입니다. 😀

해당 강의의 12:13 부분의 연습문제이시군요! 😁

먼저, 출력 결과 화면을 첨부해주시면 제가 더 자세하게 답변을 드리는 데에 도움이 될 것 같습니다. 😊

제 환경에서는 널 문자가 빈 공간으로 잘 출력이 되는데요, 질문자님의 사례를 이해해보고자 추가적으로 탐색해본 결과 환경에 따라서 널 문자가 출력이 안될 수도 있으며, 질문자님의 말씀대로 컴파일러 버전에 따라, 특히 최신 버전일수록 널 문자열의 출력을 지원하지 않는 경우가 있다고 합니다.

하지만, 질문자님께서 작성해주신 코드가 정상적으로 실행되고 종료되었다는 점이 중요하다고 생각합니다.

#include <iostream>

using namespace std;

int main() {

  char name[] = "jack jack";

  const int n_name = sizeof(name) / sizeof(name[0]);

  char* ptr = name;

  for (int i = 0; i < n_name; i++) {
    cout << *(name + i);
  }

  cout << "--";

  cout << endl << "----" << endl;

  cout << "Practice - while" << endl;

  int i = 0;
  while (true) {
   cout << *ptr;
   ++ptr;
   if (*ptr == '\0') break;
  }

  cout << "--";

  return 0;
}

위 코드를 컴파일하시고 실행하시면 정상적으로 실행 후 종료가 되시는 것은 확인하실 수 있을 거에요.

 

이 때, 해당 연습 문제의 핵심은

char name[] = "jack jack";

위 코드 라인과 같이 문자열 변수를 선언하여도, "문자열의 끝에는 문자열의 끝을 알리기 위한 null 문자가 자동으로 추가된다" 는 점을 확인하는 것이라고 생각합니다.

 

따라서 만약, 위의 "jack jack" 문자열 뒤에 '\0' 문자가 추가되지 않았다면,
아래 코드에서 *ptr'\0' 이 되는 경우가 없게 됨으로, if() 조건 문이 이 되는 경우가 없게 되고,
while() 문을 탈출하지 못하게 되어 프로그램이 정상적으로 실행/종료 되지 않았을 거에요.

while (true) {
 cout << *ptr;
 ++ptr;
 if (*ptr == '\0') break;
}

따라서, 위의 코드로 작성한 프로그램이 정상적으로 실행/종료 되었다는 것은,
while() 문을 반복하던 중 *ptr 변수가 '\0' 문자를 만났고, if() 조건문을 통해 반복문을 탈출하여 프로그램이 정상적으로 실행/종료 되었다는 것을 의미합니다.
즉, char name[] = "jack jack"; 에서 "jack jack" 문자열 뒤에 자동으로 '\0' 문자가 삽입되었다는 것이죠!

그럼에도 불구하고 만약, '\0' 문자의 삽입 여부 및 존재 유무를 직접 확인해보고 싶으시다면,
아래와 같이 코드를 작성하셔서 실행해보시면 도움이 되실 것 같습니다.

#include <iostream>

using namespace std;

int main()
{
  char name[] = "Jack jack";

  const int n_name = sizeof(name) / sizeof(char);

  char* ptr = name;

  cout << "Practice - while" << endl;

  while (true)
  {
    cout << *ptr;
    ++ptr;
    if (*ptr == '\0') {
      cout << "NULL!"; // 직접 출력해보며 확인!!
      break;
    }
  }

  return 0;
}
  • 출력 결과
    image

답변이 도움이 되셨길 바라며, 또 궁금하신 점 있으시면 언제든지 편하게 질문글 남겨주세요!

꼼꼼하게 공부하시는 모습 멋있으시고, 스스로 질문에 대한 답도 유추하시는 점이 인상깊습니다. 😀😀😀
감사합니다. 화이팅!! 👍👍👍