해결된 질문
작성
·
108
·
수정됨
0
강의 18:20에서
char str1[5] = {'H', 'e', 'l', 'l', 'o'};
이게 이 전 강의인 배열과 문자열 강의에서 마지막에 '\0' 를 넣어줘야 문자를 인식한다고 이해했는데요
char str1[5] = {'H', 'e', 'l', 'l', 'o', '\0'}; 으로 안되어있어도 상관 없는건지 궁금합니다.
또한 저렇게 된다면 str1[6] 이 되어야하는 건가요?
제가 혼자 생각해본 바로는 만약 출력문에서
printf("%s" , str1[]) 로 출력을 하려고했다면
char str1[5] = {'H', 'e', 'l', 'l', 'o'}; 이것이 아닌
char str1[5] = {'H', 'e', 'l', 'l', 'o', '\0'}; 이렇게 선언을 하는게 맞는걸까요?
+그렇다면 만약 예제에서
char str1[] = {'H', 'e', 'l', 'l', 'o', '\0'}; 이었다면
sizeof(str1) 과 sizeof(str2)의 값은 같아질까요?
답변 2
0
안녕하세요, 이미 답을 알고 계신 것 같지만 답변 남겨드립니다.
알고 계신 것처럼, char str1[5] = {'H', 'e', 'l', 'l', 'o'};
에서는 널 종료 문자가 없습니다. 이 배열은 문자 배열이지만 엄밀히 말하면 C 언어에서 "문자열"은 아닙니다.
C 언어에서 문자열은 반드시 널 종료 문자(\0
)로 끝나야 합니다. 그래야 printf("%s", str1)
과 같은 문자열 함수들이 문자열의 끝을 인식할 수 있습니다.
따라서 printf("%s", str1)
으로 출력하려면
char str1[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
와 같이 선언해야 합니다. 배열 크기도 6으로 늘려야 합니다.
만약 크기가 5인 배열에 5개의 문자와 널 종료 문자를 넣으려고 하면 배열 범위를 초과하게 됩니다.
char str1[] = {'H', 'e', 'l', 'l', 'o', '\0'};
char str2[] = "Hello";
이 경우 sizeof(str1)
과 sizeof(str2)
의 값은 동일합니다. 두 경우 모두 6바이트가 됩니다.
str2 = "Hello"
의 경우, 컴파일러가 자동으로 널 종료 문자를 추가하므로 실제로는 {'H', 'e', 'l', 'l', 'o', '\0'}
와 같이 저장됩니다.
문자열을 다룰 때는 널 종료 문자를 위한 공간을 반드시 고려해야 하며, 문자열 함수를 사용할 때는 널 종료 문자가 있는지 확인해야 합니다.
0
안녕하세요, 인프런 AI 인턴입니다. jins7267님.
C언어에서 문자열과 관련된 null 문자열 처리 및 크기 할당에 대한 질문을 주셔서 감사합니다. 몇 가지를 정리하면 다음과 같습니다.
문자열 종료를 위한 Null 문자: C에서는 문자열이란 내부적으로 문자 배열에 끝에 '\0'
으로 끝나는 문자들의 나열입니다. 즉, printf("%s", str1);
로 문자열을 출력하려면 반드시 '\0'
바이트로 끝나야 정상적으로 종료를 인식할 수 있습니다.
배열의 크기: 예제로 주신 char str1[5] = {'H', 'e', 'l', 'l', 'o'};
는 '\0'
이 없으므로 문자열로 취급받지 못하고, 문자 배열입니다. char str1[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
로 해야 str1
이 문자열로 제대로 인식됩니다.
sizeof
연산자 관련sizeof(str1)
: 배열 str1
의 총 바이트 크기를 반환합니다. char str1[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
라면, 6바이트를 가집니다.
만약 char str2[] = "Hello";
라고 정의하면 마지막에 '\0'
이 자동으로 포함되므로 실제 크기는 6이 됩니다. 이 경우 sizeof(str1)
과 sizeof(str2)
는 동일하다는 결과입니다.
이렇게 기존 질문들 참고를 통해 명확히 하는 방법도 도움이 될 것입니다. 비슷한 주제가 다뤄진 예시로는 아래 링크를 참고하실 수 있습니다:
strlen
과 sizeof
의 차이점에 대한 간략한 설명을 제공합니다.질문이 해결되셨길 바라며, 추가적인 질문이 있으시면 언제든지 남겨 주세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.