섹션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'을 넣어주는 것입니다.
필기자료 사라졌나요?(실기 일주일만에 안돼서 재도전-_-)
0
51
2
26년 1회 실기 해설 강의
0
68
2
53번 4-1 자료 오류 있는 것 같습니다.
0
73
2
7번문제
0
60
2
C언어 변형문제 9번문제 Pdf 수정요청
0
48
2
메서드 오버드라드
0
51
2
실수
0
46
1
공부 우선순위 우선강의 알려주세요
0
90
1
생성자 호출순서 강의 10번 문제 30분대 질문입니다
0
49
2
25년 2회 기출 5:40 질문입니다.
0
43
2
모의고사1회 3번 파이썬문제
0
75
2
C언어 출제변형 6번 문제
0
50
2
c언어 출제변형 강의 질문
0
32
2
28:40
0
34
2
C : 언어 배열과 문자열 수업자료
0
31
2
파이썬 리스트, 딕셔너리 질문
0
43
2
모의고사 관련 질문 건
1
69
3
자료 내용 오류
0
64
2
정적 변수, 정적 메서드(static) v2
0
51
2
v1.2 와 v0.91 PDF
0
104
1
업캐스팅 (부모형태, 자식생성자)
0
51
2
정보처리산업기사 준비중입니다.
0
74
2
실기 D -6
0
105
2
(기출) 2024년 2회 기출문제 - 이론 포함 22분32초 질문입니다
0
60
3





