해결된 질문
작성
·
81
답변 1
0
안녕하세요,
올려주시는 질문들이 하나하나 촌철살인입니다.
굉장히 디테일하면서도 헷갈릴만한 것들을 딱 짚어서 질문해주시네요.
우선 반복문이 끝나도 i가 없어지지 않는 것은 이해하셨을까요?
i가 반복문 밖에서 태어났기 때문에 반복문이 죽어도 그 값을 그대로 가지고 있습니다.
원래 대부분의 반복문 예시는 초기자에 아예 int i=0; 이런식으로 써서 반복문이 끝나면 해당 변수의 메모리 공간도 없애버리면서 다 같이 죽여버립니다. 변수의 생명주기를 눈여겨 보셔서 주의하셔야 합니다.
문자 길이가 너무 길어서, 3개짜리인 abc로 예시를 들어보겠습니다.
char example[] = "abc";
이렇게 되어있습니다.
이제 이 배열을 인덱스를 통해서 반복문을 수행하려고 합니다.
인덱스는 0부터 시작하고, 0은 첫번째 요소인 a를 뜻합니다.
앞의 temp는 임의의 char가 50으로 들어가는 배열이라고 생각하시면 됩니다. char temp[50];
1평짜리 빈 원룸을 50개 쭉 붙여놨습니다.
아래의 제가 작성한 예시코드는 질문주신 영상 속 코드와 구조가 정확히 똑같은 코드입니다.
우리가 하고 싶은 것은 50개짜리 빈 공간에 제가 원하는 문자열을 복사해서 넣는 것입니다.
그것도 반복문으로 인덱스를 돌면서 하나하나 수동으로요.
for(i = 0; example[i] != '\0'; i++) {
temp[i] = example[i];
}
temp[i] = '\0'; // 문자열 종료 문자
temp[0]에 example[0]의 값을 넣습니다.
temp[1]에 example[1]의 값을 넣습니다.
temp[2]에 example[2]의 값을 넣습니다. 그리고 i는 3이 되었습니다.
( example[2]는 NULL이 아니기 때문에 윗 줄이 실행되었고, 실행문이 끝나면 i값을 2 → 3로 증가시킴 )
그 다음에 example[i]는 example[3]이 되어있습니다.
example[3]은 '\0' 입니다. 그래서 반복문을 빠져나옵니다.
문제가 있습니다. temp[3]은 빈공간입니다.
그런데 반복문이 널문자를 할당하기 전에 반복문의 조건이 false가 되어서 수행하지 않고 종료되었습니다.
문자열이 끝났다는 NULL을 넣어줘야지 어떤 방식으로 출력하든 정상적으로 출력될 수 있습니다.
그래서 강제로 현재 i값을 이용하여 temp[3]에다가 '\0'을 넣어줍니다.
temp는 50칸짜리 공간이었지만, 이제는 정상적으로 %s나 %c+반복문으로 출력이 가능합니다.
왜냐하면 4번째 칸 (인덱스로는 3)에 '\0'이 정상적으로 위치해있기 때문이죠.
이제 %s로 출력해도 문자열 메모리의 첫 부분부터 죽 읽으면서 4번째 칸의 널을 만나서 정상적으로 종료하면서 잘 수행하겠네요.
이해에 도움이 되셨을까요?
"Null 값이 들어간 i번째 항" 을 한번 더 확실히 명시해주는 건가요? <- 이게 무슨 말씀이신지 잘 모르겠습니다.
일단 지금 앞에서 대입을 당하고 있는 50짜리칸 temp 공간에는 '\0' 자체가 없습니다.
그냥 칸으로 따지면
인덱스 : 0 | 1 | 2 | 3 | ......
값: a | b | c | 비어있음 | 비어있음 | ....
이렇게 되어있는 상태에서 반복문을 빠져나오면 i는 3이 되어있습니다.
인덱스 3은 4번째죠? 지금 비어있는 곳으로 활용할 수 있습니다.
그래서 i를 활용하여 temp의 가장 마지막 빈 곳에 '\0'을 넣어주는 것입니다.
친절한 답변 감사드립니다.
그러면 제가 이해한 바로는
사진에서 mycar.Model[i] = \0 이건
Model이라는 배열 자체를 Null 값으로 엎어치라는 뜻이 아닌,
"Null 값이 들어간 i번째 항" 을 한번 더 확실히 명시해주는 건가요?
반복문 내에서는 이미 i++까지 실행된거고
빠져나온 상태라면 그런 것 같아서요.
기본적인 배열에서는 0번째항부터 시작하니
i-1인데 저건 i번째가 맞나..요
(잘 모르겠네요 ㅎㅎ)