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

chcpower님의 프로필 이미지
chcpower

작성한 질문수

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

2024년 2회 C언어 문자열 문의드립니다.

해결된 질문

작성

·

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 함수를 사용하여 str2str1의 내용을 복사합니다. 이 과정에서 while 루프 내에서는 s[i]\0이 아닐 때까지 d[i]에 값을 복사하고, 복사가 끝난 뒤 d[i]\0을 추가합니다.

그래서 str2는 처음 5개의 문자가 first로 변경되고 그 뒤에는 기존 문자열인 "teststring"의 일부가 남아있게 됩니다. 즉, "first\0ring"이 되는 것이지요. 이 때문에 printf에서 %cstr2의 10개 문자를 출력하면 first ring이 되는 것입니다. 이는 \0이 출력에서 보이지 않아 문자열이 끊긴 것처럼 보이기 때문입니다.

다음의 링크에서 관련된 용례를 참고해 보시면 도움이 더 될 것입니다.

관련 질문들

위 링크에서는 배열과 포인터, 그리고 문자열의 종료 조건인 \0와 관련된 다양한 측면을 설명하고 있습니다. 이를 통해 문자열의 동작 원리를 좀 더 명확히 이해하실 수 있을 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

chcpower님의 프로필 이미지
chcpower

작성한 질문수

질문하기