섹션2 구조체 질문
코드에서 마지막 줄에 문자열 종료를 메모하셨는데,
문자가 한글자씩 배열돼서 문자열이 종료됐다는 걸 마지막 줄 처럼 표시해야하는 건가요?
수강 첫 질문이 문자열에 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번째 칸의 널을 만나서 정상적으로 종료하면서 잘 수행하겠네요.
이해에 도움이 되셨을까요?
0
친절한 답변 감사드립니다.
그러면 제가 이해한 바로는
사진에서 mycar.Model[i] = \0 이건
Model이라는 배열 자체를 Null 값으로 엎어치라는 뜻이 아닌,
"Null 값이 들어간 i번째 항" 을 한번 더 확실히 명시해주는 건가요?
반복문 내에서는 이미 i++까지 실행된거고
빠져나온 상태라면 그런 것 같아서요.
기본적인 배열에서는 0번째항부터 시작하니
i-1인데 저건 i번째가 맞나..요
(잘 모르겠네요 ㅎㅎ)
0
"Null 값이 들어간 i번째 항" 을 한번 더 확실히 명시해주는 건가요? <- 이게 무슨 말씀이신지 잘 모르겠습니다.
일단 지금 앞에서 대입을 당하고 있는 50짜리칸 temp 공간에는 '\0' 자체가 없습니다.
그냥 칸으로 따지면
인덱스 : 0 | 1 | 2 | 3 | ......
값: a | b | c | 비어있음 | 비어있음 | ....
이렇게 되어있는 상태에서 반복문을 빠져나오면 i는 3이 되어있습니다.
인덱스 3은 4번째죠? 지금 비어있는 곳으로 활용할 수 있습니다.
그래서 i를 활용하여 temp의 가장 마지막 빈 곳에 '\0'을 넣어주는 것입니다.
정처기 2026-3 실기 문의
0
83
2
정처기 실기 3회 컴싸 사용 여부
0
50
1
모의고사 1 회 2번문제 중
0
68
2
26-2 이론문제 재탕
1
52
1
26-2년도 코드문제
0
36
0
26-2 코드문제
0
42
1
15분 48초 질문
0
55
2
26-1년도 이론문제 재탕
0
63
1
26-1년도 코드문제 재탕
0
44
0
이론재탕만 눈치챘어도
0
72
1
25-3년도 이론문제 재탕
0
55
1
25-3년도 코드문제 재탕
0
41
0
출력값 문의
0
53
2
25-2 분기커버리지
0
46
0
25-2 이론 재탕
0
65
1
25-1 이론 재탕
0
53
1
서브넷 마스크
0
50
2
모의고사 1회 계산문제 2개 맞았는데
0
67
2
업캐스팅 문제 예시 4번 부모 호출
0
51
2
모의고사 자료 해설이 너무 불친절하네요.
0
93
2
부모의 생성자 출력 관련
0
48
2
24-3 이론파트 재탕문제
0
57
0
누락코드
0
45
1
다차원 배열 포인터 질문있습니다
0
71
3





