λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

λ¬Έμžμ—΄ λ³΅μ‚¬ν•˜κΈ° strcpy, strncpy ν•¨μˆ˜ μ‚¬μš©λ²• & 예제 + κ΅¬ν˜„

by 5566 2023. 8. 11.

1. λŒ€μ£Όμ œ: λ¬Έμžμ—΄ λ³΅μ‚¬ν•˜κΈ°

λ¬Έμžμ—΄μ„ λ³΅μ‚¬ν•˜λŠ” μž‘μ—…μ€ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 자주 μ‚¬μš©λ˜λŠ” κΈ°λŠ₯ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. C μ–Έμ–΄μ—μ„œλŠ” λ¬Έμžμ—΄μ„ λ³΅μ‚¬ν•˜λŠ” 데에 μ‚¬μš©λ˜λŠ” 두 가지 ν•¨μˆ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. 이번 κΈ€μ—μ„œλŠ” strcpy와 strncpy ν•¨μˆ˜μ— λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

2. strcpy ν•¨μˆ˜ μ‚¬μš©λ²•

strcpy ν•¨μˆ˜λŠ” λ¬Έμžμ—΄μ„ λ³΅μ‚¬ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. μ•„λž˜λŠ” strcpy ν•¨μˆ˜μ˜ κΈ°λ³Έ μ‚¬μš©λ²•μž…λ‹ˆλ‹€.

char* strcpy(char* destination, const char* source);
  • destination: λ³΅μ‚¬λœ λ¬Έμžμ—΄μ„ μ €μž₯ν•  λŒ€μƒ λ¬Έμžμ—΄ 포인터
  • source: 볡사할 λ¬Έμžμ—΄ 포인터

strcpy ν•¨μˆ˜λŠ” sourceμ—μ„œ μ‹œμž‘λ˜λŠ” λ¬Έμžμ—΄μ„ destination에 λ³΅μ‚¬ν•©λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” λ³΅μ‚¬λœ destination λ¬Έμžμ—΄ 포인터λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

3. strncpy ν•¨μˆ˜ μ‚¬μš©λ²•

strncpy ν•¨μˆ˜λŠ” λ¬Έμžμ—΄μ„ μ§€μ •λœ 길이만큼 λ³΅μ‚¬ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. μ•„λž˜λŠ” strncpy ν•¨μˆ˜μ˜ κΈ°λ³Έ μ‚¬μš©λ²•μž…λ‹ˆλ‹€.

char* strncpy(char* destination, const char* source, size_t num);
  • destination: λ³΅μ‚¬λœ λ¬Έμžμ—΄μ„ μ €μž₯ν•  λŒ€μƒ λ¬Έμžμ—΄ 포인터
  • source: 볡사할 λ¬Έμžμ—΄ 포인터
  • num: 볡사할 μ΅œλŒ€ 문자 수

strncpy ν•¨μˆ˜λŠ” sourceμ—μ„œ μ‹œμž‘λ˜λŠ” λ¬Έμžμ—΄μ„ destination에 μ΅œλŒ€ num 개의 문자만큼 λ³΅μ‚¬ν•©λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” λ³΅μ‚¬λœ destination λ¬Έμžμ—΄ 포인터λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

4. strcpy ν•¨μˆ˜ 예제

λ‹€μŒμ€ strcpy ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 예제 μ½”λ“œμž…λ‹ˆλ‹€.

#include <stdio.h>
#include <string.h>

int main() {
    char source[] = "Hello, world!";
    char destination[20];

    strcpy(destination, source);

    printf("λ³΅μ‚¬λœ λ¬Έμžμ—΄: %s\n", destination);

    return 0;
}

이 μ˜ˆμ œμ—μ„œλŠ” source λ¬Έμžμ—΄μ„ destination에 λ³΅μ‚¬ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

5. strncpy ν•¨μˆ˜ 예제

λ‹€μŒμ€ strncpy ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 예제 μ½”λ“œμž…λ‹ˆλ‹€.

#include <stdio.h>
#include <string.h>

int main() {
    char source[] = "Hello, world!";
    char destination[10];

    strncpy(destination, source, sizeof(destination) - 1);
    destination[sizeof(destination) - 1] = '\0';

    printf("λ³΅μ‚¬λœ λ¬Έμžμ—΄: %s\n", destination);

    return 0;
}

이 μ˜ˆμ œμ—μ„œλŠ” source λ¬Έμžμ—΄μ„ destination에 μ΅œλŒ€ 9개 문자만큼 λ³΅μ‚¬ν•˜κ³  좜λ ₯ν•©λ‹ˆλ‹€. λ³΅μ‚¬λœ λ¬Έμžμ—΄μ˜ 길이가 destination λ°°μ—΄μ˜ 크기λ₯Ό μ΄ˆκ³Όν•˜μ§€ μ•Šλ„λ‘ μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

2. strcpy ν•¨μˆ˜ μ‚¬μš©λ²•

strcpy ν•¨μˆ˜λŠ” λ¬Έμžμ—΄μ„ λ³΅μ‚¬ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. μ•„λž˜λŠ” strcpy ν•¨μˆ˜μ˜ κΈ°λ³Έ μ‚¬μš©λ²•μž…λ‹ˆλ‹€.

char* strcpy(char* destination, const char* source);

strcpy ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • destination: λ³΅μ‚¬λœ λ¬Έμžμ—΄μ„ μ €μž₯ν•  λŒ€μƒ λ¬Έμžμ—΄ 포인터
  • source: 볡사할 λ¬Έμžμ—΄ 포인터

strcpy ν•¨μˆ˜λŠ” sourceμ—μ„œ μ‹œμž‘λ˜λŠ” λ¬Έμžμ—΄μ„ destination에 λ³΅μ‚¬ν•©λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” λ³΅μ‚¬λœ destination λ¬Έμžμ—΄ 포인터λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

볡사가 μ΄λ£¨μ–΄μ§€λŠ” λ™μ•ˆ, destination λ¬Έμžμ—΄μ΄ μΆ©λΆ„ν•œ 크기λ₯Ό 가지고 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. λ§Œμ•½ destination λ¬Έμžμ—΄μ˜ 크기가 source λ¬Έμžμ—΄μ—μ„œ λ³΅μ‚¬λ˜λŠ” λ¬Έμžμ—΄μ˜ 크기보닀 μž‘μ„ κ²½μš°μ—λŠ” 예기치 μ•Šμ€ λ™μž‘μ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ, destination λ¬Έμžμ—΄μ€ λ°˜λ“œμ‹œ 볡사될 λ¬Έμžμ—΄μ„ μ €μž₯ν•˜κΈ°μ— μΆ©λΆ„ν•œ 크기둜 μ„ μ–Έλ˜μ–΄ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ λ©”λͺ¨λ¦¬ μ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•„λž˜λŠ” strcpy ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 예제 μ½”λ“œμž…λ‹ˆλ‹€.

#include <stdio.h>
#include <string.h>

int main() {
    char source[] = "Hello, world!";
    char destination[20];

    strcpy(destination, source);

    printf("λ³΅μ‚¬λœ λ¬Έμžμ—΄: %s\n", destination);

    return 0;
}

μœ„ μ˜ˆμ œμ—μ„œλŠ” "Hello, world!" λ¬Έμžμ—΄μ„ source에 μ €μž₯ν•˜κ³ , destinationμ—λŠ” μΆ©λΆ„ν•œ 크기의 λ°°μ—΄λ‘œ μ„ μ–Έν•©λ‹ˆλ‹€. κ·Έ ν›„, strcpy ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ sourceμ—μ„œ destination으둜 λ¬Έμžμ—΄μ„ λ³΅μ‚¬ν•©λ‹ˆλ‹€. λ³΅μ‚¬λœ λ¬Έμžμ—΄μ€ "Hello, world!" μ΄λ―€λ‘œ 이λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

3. strncpy ν•¨μˆ˜ μ‚¬μš©λ²•

strncpy ν•¨μˆ˜λŠ” λ¬Έμžμ—΄μ„ μ§€μ •λœ 길이만큼 λ³΅μ‚¬ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. μ•„λž˜λŠ” strncpy ν•¨μˆ˜μ˜ κΈ°λ³Έ μ‚¬μš©λ²•μž…λ‹ˆλ‹€.

char* strncpy(char* destination, const char* source, size_t num);

strncpy ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • destination: λ³΅μ‚¬λœ λ¬Έμžμ—΄μ„ μ €μž₯ν•  λŒ€μƒ λ¬Έμžμ—΄ 포인터
  • source: 볡사할 λ¬Έμžμ—΄ 포인터
  • num: 볡사할 μ΅œλŒ€ 문자 수

strncpy ν•¨μˆ˜λŠ” sourceμ—μ„œ μ‹œμž‘λ˜λŠ” λ¬Έμžμ—΄μ„ destination에 μ΅œλŒ€ num 개의 문자만큼 λ³΅μ‚¬ν•©λ‹ˆλ‹€. λ§Œμ•½ source λ¬Έμžμ—΄μ˜ 길이가 num보닀 μž‘μ„ 경우, λ‚¨λŠ” 곡간은 널 문자('\0')둜 μ±„μ›Œμ§‘λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” λ³΅μ‚¬λœ destination λ¬Έμžμ—΄ 포인터λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

볡사가 μ΄λ£¨μ–΄μ§€λŠ” λ™μ•ˆ, destination λ¬Έμžμ—΄μ΄ μΆ©λΆ„ν•œ 크기λ₯Ό 가지고 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. λ§Œμ•½ destination λ¬Έμžμ—΄μ˜ 크기가 num보닀 μž‘μ„ κ²½μš°μ—λŠ” 널 문자λ₯Ό λ³΅μ‚¬ν•˜κΈ° μœ„ν•΄ μΆ”κ°€ λ©”λͺ¨λ¦¬ 곡간이 ν•„μš”ν•˜λ―€λ‘œ, 예기치 μ•Šμ€ λ™μž‘μ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•„λž˜λŠ” strncpy ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 예제 μ½”λ“œμž…λ‹ˆλ‹€.

#include <stdio.h>
#include <string.h>

int main() {
    char source[] = "Hello, world!";
    char destination[10];

    strncpy(destination, source, sizeof(destination) - 1);
    destination[sizeof(destination) - 1] = '\0';

    printf("λ³΅μ‚¬λœ λ¬Έμžμ—΄: %s\n", destination);

    return 0;
}

μœ„ μ˜ˆμ œμ—μ„œλŠ” "Hello, world!" λ¬Έμžμ—΄μ„ source에 μ €μž₯ν•˜κ³ , destinationμ—λŠ” μΆ©λΆ„ν•œ 크기의 λ°°μ—΄λ‘œ μ„ μ–Έν•©λ‹ˆλ‹€. κ·Έ ν›„, strncpy ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ sourceμ—μ„œ destination으둜 μ΅œλŒ€ 9개의 문자λ₯Ό λ³΅μ‚¬ν•©λ‹ˆλ‹€. sizeof(destination) - 1은 destination λ°°μ—΄μ˜ ν¬κΈ°μ—μ„œ 널 문자λ₯Ό μœ„ν•œ 곡간을 미리 μ œμ™Έν•œ κ°’μž…λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ, λ³΅μ‚¬λœ λ¬Έμžμ—΄μ„ 좜λ ₯ν•˜κΈ° 전에 직접 널 문자λ₯Ό μΆ”κ°€ν•˜μ—¬ λ¬Έμžμ—΄μ„ μ™„μ„±μ‹œν‚΅λ‹ˆλ‹€. 결과적으둜 destinationμ—λŠ” "Hello, wo" λ¬Έμžμ—΄μ΄ λ³΅μ‚¬λ˜μ–΄ 좜λ ₯λ©λ‹ˆλ‹€.

4. strcpy ν•¨μˆ˜ 예제

strcpy ν•¨μˆ˜λŠ” λ¬Έμžμ—΄μ„ λ³΅μ‚¬ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. μ•„λž˜λŠ” strcpy ν•¨μˆ˜μ˜ 예제 μ½”λ“œμ™€ μ‹€ν–‰ κ²°κ³Όμž…λ‹ˆλ‹€.

#include <stdio.h>
#include <string.h>

int main() {
    char source[] = "Hello, world!";
    char destination[20];

    strcpy(destination, source);

    printf("λ³΅μ‚¬λœ λ¬Έμžμ—΄: %s\n", destination);

    return 0;
}

이 μ˜ˆμ œμ—μ„œλŠ” "Hello, world!" λ¬Έμžμ—΄μ„ source에 μ €μž₯ν•˜κ³ , destinationμ—λŠ” μΆ©λΆ„ν•œ 크기의 λ°°μ—΄λ‘œ μ„ μ–Έν•©λ‹ˆλ‹€. κ·Έ ν›„, strcpy ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ sourceμ—μ„œ destination으둜 λ¬Έμžμ—΄μ„ λ³΅μ‚¬ν•©λ‹ˆλ‹€. λ³΅μ‚¬λœ λ¬Έμžμ—΄μ€ "Hello, world!" μ΄λ―€λ‘œ 이λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

strcpy ν•¨μˆ˜λŠ” sourceμ—μ„œ μ‹œμž‘λ˜λŠ” λ¬Έμžμ—΄μ„ destination에 λ³΅μ‚¬ν•©λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” λ³΅μ‚¬λœ destination λ¬Έμžμ—΄ 포인터λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

볡사가 μ΄λ£¨μ–΄μ§€λŠ” λ™μ•ˆ, destination λ¬Έμžμ—΄μ΄ μΆ©λΆ„ν•œ 크기λ₯Ό 가지고 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. λ§Œμ•½ destination λ¬Έμžμ—΄μ˜ 크기가 source λ¬Έμžμ—΄μ—μ„œ λ³΅μ‚¬λ˜λŠ” λ¬Έμžμ—΄μ˜ 크기보닀 μž‘μ„ κ²½μš°μ—λŠ” 예기치 μ•Šμ€ λ™μž‘μ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ, destination λ¬Έμžμ—΄μ€ λ°˜λ“œμ‹œ 볡사될 λ¬Έμžμ—΄μ„ μ €μž₯ν•˜κΈ°μ— μΆ©λΆ„ν•œ 크기둜 μ„ μ–Έλ˜μ–΄ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ λ©”λͺ¨λ¦¬ μ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μœ„ 예제λ₯Ό μ‹€ν–‰ν•˜λ©΄ λ‹€μŒκ³Ό 같은 κ²°κ³Όλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

λ³΅μ‚¬λœ λ¬Έμžμ—΄: Hello, world!

μ½”λ“œμ—μ„œ strcpy ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ source λ¬Έμžμ—΄μ„ destination에 λ³΅μ‚¬ν•˜μ˜€κΈ° λ•Œλ¬Έμ—, destinationμ—λŠ” "Hello, world!" λ¬Έμžμ—΄μ΄ λ³΅μ‚¬λ˜μ–΄ 좜λ ₯λ©λ‹ˆλ‹€.

5. strncpy ν•¨μˆ˜ 예제

strncpy ν•¨μˆ˜λŠ” λ¬Έμžμ—΄μ„ μ§€μ •λœ 길이만큼 λ³΅μ‚¬ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. μ•„λž˜λŠ” strncpy ν•¨μˆ˜μ˜ 예제 μ½”λ“œμ™€ μ‹€ν–‰ κ²°κ³Όμž…λ‹ˆλ‹€.

#include <stdio.h>
#include <string.h>

int main() {
    char source[] = "Hello, world!";
    char destination[10];

    strncpy(destination, source, sizeof(destination) - 1);
    destination[sizeof(destination) - 1] = '\0';

    printf("λ³΅μ‚¬λœ λ¬Έμžμ—΄: %s\n", destination);

    return 0;
}

이 μ˜ˆμ œμ—μ„œλŠ” "Hello, world!" λ¬Έμžμ—΄μ„ source에 μ €μž₯ν•˜κ³ , destinationμ—λŠ” μΆ©λΆ„ν•œ 크기의 λ°°μ—΄λ‘œ μ„ μ–Έν•©λ‹ˆλ‹€. κ·Έ ν›„, strncpy ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ sourceμ—μ„œ destination으둜 μ΅œλŒ€ 9개의 문자λ₯Ό λ³΅μ‚¬ν•©λ‹ˆλ‹€. sizeof(destination) - 1은 destination λ°°μ—΄μ˜ ν¬κΈ°μ—μ„œ 널 문자λ₯Ό μœ„ν•œ 곡간을 미리 μ œμ™Έν•œ κ°’μž…λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ, λ³΅μ‚¬λœ λ¬Έμžμ—΄μ„ 좜λ ₯ν•˜κΈ° 전에 직접 널 문자λ₯Ό μΆ”κ°€ν•˜μ—¬ λ¬Έμžμ—΄μ„ μ™„μ„±μ‹œν‚΅λ‹ˆλ‹€.

strncpy ν•¨μˆ˜λŠ” sourceμ—μ„œ μ‹œμž‘λ˜λŠ” λ¬Έμžμ—΄μ„ destination에 μ΅œλŒ€ num 개의 문자만큼 λ³΅μ‚¬ν•©λ‹ˆλ‹€. λ§Œμ•½ source λ¬Έμžμ—΄μ˜ 길이가 num보닀 μž‘μ„ 경우, λ‚¨λŠ” 곡간은 널 문자('\0')둜 μ±„μ›Œμ§‘λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” λ³΅μ‚¬λœ destination λ¬Έμžμ—΄ 포인터λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

볡사가 μ΄λ£¨μ–΄μ§€λŠ” λ™μ•ˆ, destination λ¬Έμžμ—΄μ΄ μΆ©λΆ„ν•œ 크기λ₯Ό 가지고 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. λ§Œμ•½ destination λ¬Έμžμ—΄μ˜ 크기가 num보닀 μž‘μ„ κ²½μš°μ—λŠ” 널 문자λ₯Ό λ³΅μ‚¬ν•˜κΈ° μœ„ν•΄ μΆ”κ°€ λ©”λͺ¨λ¦¬ 곡간이 ν•„μš”ν•˜λ―€λ‘œ, 예기치 μ•Šμ€ λ™μž‘μ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μœ„ 예제λ₯Ό μ‹€ν–‰ν•˜λ©΄ λ‹€μŒκ³Ό 같은 κ²°κ³Όλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

λ³΅μ‚¬λœ λ¬Έμžμ—΄: Hello, wo

μ½”λ“œμ—μ„œ strncpy ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ source λ¬Έμžμ—΄μ„ destination에 μ΅œλŒ€ 9개의 문자λ₯Ό λ³΅μ‚¬ν•˜μ˜€κΈ° λ•Œλ¬Έμ—, destinationμ—λŠ” "Hello, wo" λ¬Έμžμ—΄μ΄ λ³΅μ‚¬λ˜μ–΄ 좜λ ₯λ©λ‹ˆλ‹€. 널 문자λ₯Ό 직접 μΆ”κ°€ν•˜μ—¬ λ¬Έμžμ—΄μ„ μ™„μ„±μ‹œμΌ°κΈ° λ•Œλ¬Έμ— 좜λ ₯ κ²°κ³Όμ—μ„œλŠ” "Hello, wo"둜 λλ‚˜λŠ” λ¬Έμžμ—΄μ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

λŒ“κΈ€