본문 바로가기
C/C Library

strncpy

by memora 2024. 6. 17.

Index로 돌아가기  

 

【기  능】 문자열을 n바이트만큼 복사하는 기능
 
 【소  속】 string.h 
   #include <string.h>
 
 【서  식】  
   char *strcnpy(char *tar, const char *src, sizt_t n);
 
 【설  명】  
   src의 문자열을 선두로 부터 n바이트분 tar으로 복사한다. 
   1) src문자열의 사이즈가 n바이트 보다 길면 n바이트의 문자가 복사되지만 공백문자는 추가
      되지 않는다.
   2) src문자열의 사이즈가 n바이트 보다 짧으면 모자라는 사이즈분이 공백문자로 채워진다.
   3) src문자열과 tar문자열의 어드레스가 겹쳤을 때의 동작은 부정.
 
 【인  수】  
   src : 복사대상 문자열의 선두 어드레스
   tar : 복사되는 문자열이 보존되는 메모리의 어드레스
   n : 복사되는 문자열 사이즈
 
 【리턴 값】
  tar의 어드레스
 
 【사용 예】
#include <stdio.h>
#include <string.h>
#include <stdint.h>

int main()
{
    uint8_t src[7] = "123456";
    uint8_t tar[11];
    uint8_t i;
    uint8_t *psrc;
    uint8_t *ptar;

    for(i = 0; i < 10; i++){
        tar[i] = 0xFF;
    }

 // 1)
    strncpy(tar, src, 3);
    for(i = 0; i < 10; i++){
        printf("0x%02x ", tar[i]);
    }
    printf("\n");


    for(i = 0; i < 10; i++){
        tar[i] = 0xFF;
    }

 // 2)
    strncpy(tar, src, 8);
    for(i = 0; i < 10; i++){
        printf("0x%02x ", tar[i]);
    }
    printf("\n");


 // 3)
    psrc = src;
    ptar = src + 2;

    printf("address for psrc = 0x%x\n", psrc);
    printf("address for ptar = 0x%x\n", ptar);

    for(i = 0; i < 4; i++){
        ptar[i] = 0xFF;
    }

    for(i = 0; i < 6; i++){
        printf("0x%02x ", psrc[i]);
    }
    printf("\n");
    for(i = 0; i < 4; i++){
        printf("0x%02x ", ptar[i]);
    }
    printf("\n");

    strncpy((void *)ptar, (void *)psrc, 4);
    for(int i = 0; i < 6; i++){
        printf("0x%02x ", src[i]);
    }
    printf("\n");


    return 0;
}

  【결   과】
   1)
   0x31 0x32 0x33 0xff 0xff 0xff 0xff 0xff 0xff 0xff
   2)
   0x31 0x32 0x33 0x34 0x35 0x36 0x00 0x00 0xff 0xff
                                            공백문자
   3)
   address for psrc = 0x61ff09  // psrc의 어드레스(src의 어드레스)
   address for ptar = 0x61ff0b  // ptar의 어드레스(src의 어드레스 + 2의 위치)
   0x31 0x32 0xff 0xff 0xff 0xff  // ptar에 문자를 복사했지만 psrc도 영향을 받음
   0xff 0xff 0xff 0xff               // ptar의 내용
   0x31 0x32 0x31 0x32 0x31 0x32 // psrc의 문자열을 ptar로 복사하면 어드레스가 겹치기
                                            // 때문에 어떤 결과가 얻어질지 정해지지 않음

 

Index로 돌아가기

반응형

'C > C Library' 카테고리의 다른 글

memmove  (2) 2024.06.18
strcmp  (2) 2024.06.17
strcpy  (2) 2024.06.07
memchr  (4) 2024.06.03
memcmp  (2) 2024.06.02