해결된 질문
작성
·
40
0
#include <stdio.h>
void strcopy(char d[], const char s[]) {
int i = 0;
while (s[i] != '\0') {
d[i] = s[i];
i++;
}
d[i] = '\0';
}
int main() {
char str1[] = "first";
char str2[50] = "teststring";
int result = 0;
strcopy(str2, str1);
for (int i = 0; str2[i] != '\0'; i++) {
result += i;
}
printf("%d\n", result);
for (int i = 0; i < 10; i++) {
printf("%c", str2[i]);
}
}
출력값:
10
first ring
printf("%c", str2[i]); // first ring 이렇게 출력되었는데
while (s[i] != '\0') {
d[i] = s[i];
i++;
}
d[i] = '\0';
여기서 while타고 s[i]에 first 마지막인 t 가 들어가면 다음 배열이 들어가지않으니
d[i] = '\0'; 들어가고
firist\0 담기는게 아닌가해서 질문드립니다.
그래서 출력값이 first ring 이렇게 나오는게 맞을까요?
답변 2
0
안녕하세요, 저 first ring의 경우에는 맨 마지막 for문 구문입니다. while 때문에 출력되는 것이 아닙니다.
실제 시험에서는 while문까지만 나왔고, 정말로 '\0' 문자가 중간에 들어갔는지를 확인하기 위해서 제가 일부러 for문에 i의 값을 끝까지 출력해본 것입니다.
지금 보시면 맨 마지막 for문의 출력의 경우 0부터 9까지 직접 지정해서 반복을 시행하여 출력하고 있습니다. 해당 부분을 while하고 착각하신 것 같습니다.
최초 설명시 while 부분만 본다면, 말씀해주신 것이 맞습니다. 그 부분 출력값보면 그렇게 작성되어 있을 겁니다.
0
안녕하세요, 인프런 AI 인턴입니다. chcpower님.
질문하신 내용은 C언어에서의 문자열 복사 과정과 문자열 끝을 나타내는 \0
(널 문자)의 처리가 어떻게 이루어지는지를 이해하는 데 도움이 됩니다.
코드상에서 strcopy
함수를 사용하여 str2
에 str1
의 내용을 복사합니다. 이 과정에서 while
루프 내에서는 s[i]
가 \0
이 아닐 때까지 d[i]
에 값을 복사하고, 복사가 끝난 뒤 d[i]
에 \0
을 추가합니다.
그래서 str2
는 처음 5개의 문자가 first
로 변경되고 그 뒤에는 기존 문자열인 "teststring"
의 일부가 남아있게 됩니다. 즉, "first\0ring"
이 되는 것이지요. 이 때문에 printf
에서 %c
로 str2
의 10개 문자를 출력하면 first ring
이 되는 것입니다. 이는 \0
이 출력에서 보이지 않아 문자열이 끊긴 것처럼 보이기 때문입니다.
다음의 링크에서 관련된 용례를 참고해 보시면 도움이 더 될 것입니다.
위 링크에서는 배열과 포인터, 그리고 문자열의 종료 조건인 \0
와 관련된 다양한 측면을 설명하고 있습니다. 이를 통해 문자열의 동작 원리를 좀 더 명확히 이해하실 수 있을 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.