강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

김민규님의 프로필 이미지
김민규

작성한 질문수

(2025) 일주일만에 합격하는 정보처리기사 실기

포인터의 개념과 활용

strlen에 대한 질문

해결된 질문

작성

·

101

0

안녕하세요. 강의 도중 strlen과 sizeof을 비교하는 부분(18분 경)에서 strlen에 대한 질문이 생겨서 글을 작성하게 되었습니다.

 

직접 3가지 str을 정의하였고, 각 str에 대해 strlen()값을 출력하였더니, 다음과 같았습니다.

 

  // 문자열 배열 (NULL 문자 포함 X)
  char str1[5] = {'H', 'e', 'l', 'l', 'o'};
  // 문자열 (NULL 문자 포함 O)
  char str2[] = "Hello"; // {'H', 'e', 'l', 'l', 'o', '\0'};

  char str3[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

  printf("strlen(str1) : %d\n", strlen(str1));
  printf("strlen(str2) : %d\n", strlen(str2));
  printf("strlen(str3) : %d\n", strlen(str3));

출력되는 결과는 각각 10, 5, 5로 실제 문자형 배열의 크기를 지정한 5를 훨씬 넘어가는 결과가 나왔습니다.

이 결과는 아무래도 마지막 원소로 NULL문자를 넣지 않아서 발생 한 듯 싶은데, 왜 하필 10이 나왔는지 이유가 궁금합니다.

또한, 이럴 경우까지도 고려하여 sizeof를 사용하는 것이 더 바람직한 방법인지 궁금합니다.

 

마지막으로, 구글링 결과 sizeof의 반환 타입이 size_t이기 때문에 %zu라는 형식 변환자를 사용해야 한다고 하는데, %lu의 경우 보다 자유롭게 대략 long int로 판별될 경우 사용하면 되는 것인지도 궁금합니다. C언어에서 타입을 지정하는 것이 굉장히 중요한 것 같은데, %lu로 퉁쳐도(??) 되는 것인지, 그 판단은 어떻게 하는지 등이 궁금합니다!

긴 글 읽어주셔서 감사합니다.

답변 2

0

주말코딩님의 프로필 이미지
주말코딩
지식공유자

먼저 질문 감사합니다.

열심히 하는 모습을 항상 응원합니다.

 

답변을 드리자면, 첫 번째의 경우에는 숫자가 계속 달라질 수 있습니다.

이게 무슨 말도 안되는 소리냐면, 보통 C언어에서 문자의 길이를 잴 때는 \0(NULL) 문자를 기준으로 잽니다.

질문 주신 대로 마지막을 \0로 막지 않았기 때문에 저 이후로 이어진 메모리에서 \0을 만날 때까지 계속 길이를 세려고 할 겁니다.

 

좀 더 깊게 보려면 C언어의 컴파일러를 어떤 종류로 했는지, 어떤 운영체제에서 돌렸는 지에 봐야겠으나

보통은 메모리의 상태가 보장되지 않은 쓰레기값이 표현될 때는 그렇게 설명하고 끝냅니다.

제대로 코드를 작성하지 않은 것으로 배우니까요.

 

예를 들어보자면, 온라인 컴파일러에서는 해당 코드의 첫 번째 문장이 6으로 나옵니다.

직접 해보시기를 권장드립니다. (https://www.programiz.com/c-programming/online-compiler/)

 

다른 컴파일러에서 하면 10이 나옵니다.

https://www.onlinegdb.com/online_c_compiler

 

이런 경우는 시험에서 절대로 나오지 않습니다.

이전에도 컴파일러마다 다르게 출력이 되는 문제가 출제되었으나, 전원 정답처리 되었기 때문입니다.

 

보통 문자열을 선언할 때는 가장 마지막을 \0로 막아서 끝났다는 것을 알려주거나, 문자열 리터럴 방식(str2[]) 이렇게 빈 배열로 선언하고 문자열로 선언해서 알아서 \0이 추가되게 합니다.

 

그것과 별개로 strlen이 long unsigned int를 리턴해서 %ld로 받아야 한다는 것은 정확하게는 그렇지만 보통은 warning으로 뜨고 정상적으로 출력이 되긴 합니다.

 

실제로 C언어로 프로젝트에 들어가보면 별에 별 희한한 경우를 다 보게 되는데, 학부에서 배우는 수준에서는 여기까지만 아셔도 시험 문제를 푸는 데에는 큰 영향이 없습니다.

 

 

김민규님의 프로필 이미지
김민규
질문자

친절한 답변 감사드립니다!

 

결론적으로는, c언어 특성 상 어떤 운영체제에서 어떤 컴파일러를 통해 컴파일을 수행하는지에 따라 \0이 포함되지 않은 문자 배열의 strlen 값이 다르게 나올 수 있고, 그 이유는 메모리에서 \0을 찾을 때 까지 순회하기 때문이라는 이유인 것 같네요!

 

어쨋든, 정보처리기사 실기를 준비하는 입장에서는 큰 문제는 아니지만, 이후 개발자가 될 경우에는 알아둬야 하는 부분인 것 같네요! 비슷한 상황을 만났을 때 큰 도움이 될 것 같습니다!

 

항상 친절한 답변 감사드립니다.

0

안녕하세요, 인프런 AI 인턴입니다. 김민규님.

질문 주신 strlensizeof에 관한 내용은 문자열 처리에서 자주 헷갈릴 수 있는 부분입니다. 이와 관련하여 다음과 같은 정보와 관련 질문들을 참조하시면 도움이 될 것입니다.

strlensizeof의 차이

  • strlen 함수: 문자열에서 처음으로 null 문자('\0')가 나타날 때까지의 문자 개수를 반환합니다. 만약에 null 문자가 없고 메모리 상의 다른 곳에서 null 문자를 찾게 된다면, 이상한 값이 반환될 수 있습니다.
  • sizeof 연산자: 배열 전체의 크기를 바이트 단위로 반환합니다. 배열이 아닌 포인터에 사용될 경우에는 포인터의 크기(일반적으로 8바이트)를 반환합니다.

김민규님의 코드에 대한 설명

  • str1의 경우, null 문자로 끝나지 않기 때문에, 메모리를 넘어 null 문자가 나타날 때까지 계속해서 문자를 세게 되어 예측할 수 없는 값이 나올 수 있습니다.
  • str2str3는 null 문자로 올바르게 종료되므로 strlen은 5를 반환하게 됩니다.

관련 URL 및 개선된 설명

  • 배열과 문자열 13:54초 출력결과 문의: 이 질문에서는 sizeofstrlen의 차이점과 실제 출력 결과에 대한 상세한 설명을 제공합니다.
  • %zu%lu의 차이점: size_t는 일반적으로 unsigned long 타입이지만, 플랫폼에 따라 다른 크기를 가질 수 있습니다. %zusize_t를 출력하기 위해 설계된 형식으로, 가장 안전한 선택입니다. %lu를 사용하면 타입 불일치로 예기치 않은 결과가 발생할 수 있습니다.

김민규님의 질문이 잘 해결되기를 바랍니다. 추가적인 궁금한 점이나 논의가 필요하시면 언제든지 이어서 질문해 주세요. 저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김민규님의 프로필 이미지
김민규

작성한 질문수

질문하기