인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

김다훈님의 프로필 이미지
김다훈

작성한 질문수

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

섹션2 구조체 질문

해결된 질문

작성

·

81

0

1000043198.jpg코드에서 마지막 줄에 문자열 종료를 메모하셨는데,

문자가 한글자씩 배열돼서 문자열이 종료됐다는 걸 마지막 줄 처럼 표시해야하는 건가요?

수강 첫 질문이 문자열에 null을 표시해야하는 경우에 대해 여쭤보는 거였는데 아직도 많이 헷갈립니다.

제대로 된 지식이 아직 머리에 없는 채로 코드 해석을 하다가 마지막줄을 보자마자 mycar.model[i]=\0 를 보고 배열을 null값으로 싹 비워버리는 줄 알았네요...ㅎ

 

답변 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번째 칸의 널을 만나서 정상적으로 종료하면서 잘 수행하겠네요.

 

이해에 도움이 되셨을까요?

김다훈님의 프로필 이미지
김다훈
질문자

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

그러면 제가 이해한 바로는

사진에서 mycar.Model[i] = \0 이건

Model이라는 배열 자체를 Null 값으로 엎어치라는 뜻이 아닌,

"Null 값이 들어간 i번째 항" 을 한번 더 확실히 명시해주는 건가요?

반복문 내에서는 이미 i++까지 실행된거고

빠져나온 상태라면 그런 것 같아서요.

기본적인 배열에서는 0번째항부터 시작하니

i-1인데 저건 i번째가 맞나..요

(잘 모르겠네요 ㅎㅎ)

 

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

"Null 값이 들어간 i번째 항" 을 한번 더 확실히 명시해주는 건가요? <- 이게 무슨 말씀이신지 잘 모르겠습니다.

 

일단 지금 앞에서 대입을 당하고 있는 50짜리칸 temp 공간에는 '\0' 자체가 없습니다.

그냥 칸으로 따지면

인덱스 : 0 | 1 | 2 | 3 | ......
값: a | b | c | 비어있음 | 비어있음 | ....

이렇게 되어있는 상태에서 반복문을 빠져나오면 i는 3이 되어있습니다.

인덱스 3은 4번째죠? 지금 비어있는 곳으로 활용할 수 있습니다.

 

그래서 i를 활용하여 temp의 가장 마지막 빈 곳에 '\0'을 넣어주는 것입니다.

김다훈님의 프로필 이미지
김다훈

작성한 질문수

질문하기