해결된 질문
작성
·
110
0
lower_str[strlen(original)]='\0';
upper_str[strlen(original)]='\0';
는 어떤 기능을 하는지 궁금합니다
문제 풀이는 다 이해가 되는데
저 식이 뭔지 잘 모르겠어서 질문드립니다
답변 2
1
문자열 가장 마지막에 null 문자를 넣는 겁니다.
길이는 양수 1부터 시작하는데 인덱스는 0부터 시작합니다.
그래서 null이 없는 문자의 길이를 잰 다음 그것을 역으로 인덱스로 활용하면 문자의 끝 바로 다음 인덱스를 가리킵니다.
그 부분은 문자가 없고, null 문자로 막아야 합니다. 그래서 저렇게 쓰는 것이고, 그 부분에 null을 할당해서 온전한 문자열을 만드는 것입니다.
original의 배열 같은 경우에는 맨 끝 문자의 그 다음을 조사해보면 \0이 들어가 있을 겁니다.
그런데 아래에 2개의 배열은 다릅니다.
지금 original에서 하나씩 빼서 일일이 넣고 있습니다.
자동으로 문자열 끝에 \0을 넣으려면 original처럼 임의의 배열을 선언하고 문자열 전체를 넣거나, 원래 있던 문자열을 온전히 복사해왔을 때 그렇습니다.
지금은 하나씩 글자를 빼서 넣고 있습니다. (반복문에서 그 할당이 일어나는 것이죠)
C언어는 일종의 바보 언어입니다. 자동으로 해주는 게 그렇게 많이 없습니다.
반복문만 보면, 도대체 어디가 문자열의 끝인지 알 수 있는 방법이 없습니다. 만약에 "반복문의 조건문에서 \0을 만났을 때, \0을 문자 다음에 삽입하라" 라는 지시문이 있으면 또 달라졌겠죠.
지금 반복문은 그저 문자를 하나씩 넣은 것 뿐이지, \0 문자를 명시적으로 넣으라고 한 적이 없습니다. 이 경우에는 우리가 일일이 넣어줘야 합니다.
비슷한 경우가 이겁니다.
char arr[2] = {"H","e"};
이 경우에도 null이 없습니다. 그래서 출력을 할 때 값이 제대로 나오지 않을 수 있습니다.
명확하게 하려면
char arr[] = "He";
로 하거나
char arr[3] = {'H', 'e', '\0'};
거나
char *str = "He";
로 선언했어야 합니다.
char str[3] = "He";
도 가능합니다.
질문이 하나 더 있습니다!
널값은 배열이 생성될 때 자동으로 내장되어있다고 알고 있었는데
저 경우는 왜 널값을 넣어줘야되는지 궁금합니다