티스토리 뷰

반응형

1) 목표

  • 문자열(배열)을 다루는 함수 알아보기
  • 문자열(배열) 함수 사용해 보기

2) 설명

  • 제목처럼 문자열(배열) 다루는 것은 사실 메모리를 다루는 기술입니다.
    변수를 선언하면 메모리가 할당이 되고 변수에 값을 넣고 참조할 수 있는것이 메모리를 다루는것 입니다.
  • 여기서는 c언어에서 제공하는 문자열 관련 함수, 메모리 관련 함수를 다루고자 합니다.

3-1) 메모리 관련 함수 예제 프로그램

    ▶ vi mem.c

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

void main() {
    char str[] = "Hello, World";
    char buf[12];

    // str의 내용을 buf로 복사함
    memcpy(buf, str, 12);               // Hello, World (12자)

    printf("buf:[%12.12s]\n", buf);
}

    ▶ 컴파일/실행

~/c-lecture (master ✘)✭ ᐅ gcc -o mem mem.c
~/c-lecture (master ✘)✭ ᐅ ./mem
buf:[Hello, World]
~/c-lecture (master ✘)✭ ᐅ

    ▶ 분석

  • 처음 살펴볼 함수는 상당히 많이 쓰이는 memcpy()함수 입니다.
    이 함수를 사용하기 위해서 #include <string.h> 문이 추가됩니다.
    man memcpy 로 확인해 보시면 아래와 같습니다.

  • 함수의 프로토타입도 자세히 나와 있습니다.
    void *memcpy(void *dest, const void *src, size_t n);
    간략하게 설명을 드리면 두번째 인자 src에서 첫번째 인자 dest로 세번째 인자 크기 n 만큼 복사하는 함수 입니다.
    ※ void * 가 나오는데 void 포인터형입니다. 이 void 포인터형은 어떠한 타입으로도 될 수 있다는 의미입니다.
       예제 mem.c에서는 char 타입을 넘겨주는데 memcpy 함수가 void 타입으로 받아서 가능합니다.
    ※ size_t 은 정수형으로 크기를 나타내고 있다는 정도로만 알아두세요.
    ※ 두번째 인자를 보시면 앞에 const가 붙은걸 알수 있습니다. const 의미는 상수의 의미가 있습니다.
        변수와 다르게 상수는 값을 변경할 수 없습니다.
        그래서 memcpy()함수내에서 src의 내용은 변경할 수 없다는걸 정의하고 있습니다.
  • memcpy()함수를 사용하면 for문으로 반복처리를 할 필요가 없습니다.
  • 'Hello, World'의 문자수는 12자 즉, 12바이트를 차지합니다. 그래서 복사할 대상를 char buf[12];로 선언을 하고
    memcpy(buf, str, 12); 변수 str의 값을 buf로 12바이트 복사하는 것입니다.
  • buf를 출력할때 printf의 서식 %12.12s 를 사용했는데요. 이 서식은 %s 문자열 출력 서식과 유사합니다.
    소수점(.)를 기준으로 앞의 12는 전체자리수 뒤의 12는 출력할 변수(buf)의 자리수를 의미합니다.
    즉, buf[12] 12바이트를 출력하고자 %12.12s 의 서식을 사용했습니다.
    printf()함수의 서식은 상당히 많이 있습니다. 필자도 전부 외우지 못합니다. 여러분도 이런 서식이 있구나. 라고 인지만 하시고 나중에 필요할때 man 3 printf 라던가 구글에서 검색해서 사용하시면 됩니다. 

  • 문자열에서 설명드렸는데요. 예제의 char buf[12]; 은 문자열(string)이 아닙니다.
    문자열은 마지막에 null(0x00) 문자가 있어야 문자열이 된다고 말씀을 드렸죠.
    문자열이 아니기 때문에 printf()에서도 %s가 아닌 %12.12s로 출력한 것입니다.
    (%s 서식은 출력할 변수에서 null문자까지 출력합니다.)
    그럼 buf를 문자열로 바꿀려면 어떻게 하면 되나요? 그렇죠 마지막에 null(0x00)를 추가하면 되겠죠.
    그런데 memcpy()함수를 사용하는데 마지막에 null(0x00)를 추가하는게 쉽지가 않습니다.
    buf의 마지막 위치를 알아야 하지요. 이때 이런 문제를 해결할수 있는 함수가 존재합니다.

3-2) 메모리 관련 함수 예제 프로그램 2

    ▶ vi mem2.c

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

void main() {
    char str[] = "Hello, World";
    char buf[32];                       // 버퍼 크기를 12 -> 32로 넉넉히 잡습니다.

    // buf를 null 문자로 초기화 합니다.
    memset(buf, 0x00, sizeof(buf));

    // str의 내용을 buf로 복사함
    memcpy(buf, str, 12);               // Hello, World (12자)

    printf("buf:[%s]\n", buf);
}

    ▶ 컴파일/실행

~/c-lecture (master ✘)✭ ᐅ gcc -o mem2 mem2.c
~/c-lecture (master ✘)✭ ᐅ ./mem2
buf:[Hello, World]
~/c-lecture (master ✘)✭ ᐅ

    ▶ 분석

  • buf를 문자열(string)로 만드는게 목표입니다.
    여기서 memset() 함수가 새로게 등장합니다. 이함수도 memcpy와 같이 상당히 많이 쓰입니다.
    memcpy()함수를 사용할때 한짝으로 memset()가 자주 사용됩니다.
    memset도 자세히 알고 싶으시면 man memset 으로 보시면 됩니다.

  • memset함수의 프로토타입을 보면
    void *memset(void *s, int c, size_t n);
    첫번째 인자 s를 두번째 인자 c로 세번째 인자 n만큼 채우라는 의미 입니다.
    memset(buf, 'A', 10); 의 의미는 buf값을 'A'로 10개 채우라는 의미입니다.
...
    // buf를 null 문자로 초기화 합니다.
    memset(buf, 0x00, sizeof(buf));
  • 변수 buf의 값을 null(0x00)으로 채우라는 의미입니다. 여기서 sizeof(buf) 가 나오는데요
    4.변수 강의에서 설명드렸는데요. sizeof()는 변수타입뿐 아니라 이렇게 배열의 크기를 구하는데도 사용됩니다.
    sizeof() 는 상당히 많이 사용됩니다. 이렇게 사용되는것도 알아두세요.
    그래서 sizeof(buf) == 32입니다. char buf[32]; 로 선언되었기 때문에 32입니다.
  • buf 배열은 크기가 32바이트이고 그값은 전부 null로 되어있게 됩니다.
  • 여기에 memcpy()문으로 str값 12바이트를 복사하게 되면
    buf의 처음 12바이트는 'Hello World'가 되고 나머지는 null(0x00)로 그대로 있습니다.
    그러면 buf는 문자열인가요? 맞습니다 원하는 데이타 마지막에 null(0x00)문자가 있기 때문에 문자열입니다.
  • buf 문자열을 출력하기 위해서 printf()의 서식을 %s 만을 사용해서 출력합니다.

3-3) 문자열 관련 함수 예제 프로그램

    ▶ vi str.c

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

void main() {
    char str[] = "Hello, World";
    char buf[32];

    // str의 내용을 buf로 복사함
    strcpy(buf, str);

    printf("buf:[%s]\n", buf);
}

    ▶ 컴파일/실행

~/c-lecture (master ✘)✭ ᐅ gcc -o str str.c
~/c-lecture (master ✘)✭ ᐅ ./str
buf:[Hello, World]
~/c-lecture (master ✘)✭ ᐅ

    ▶ 분석

  • 이번 예제는 문자열을 다룹니다.
    char str[] = "Hello World"; 이전 강의에서 설명드렸는데
    배열을 선언과 동시에 문자열로 초기화 가능합니다. str은 문자열입니다.
  • 이번 예제에서는 strcpy()함수가 나옵니다. memcpy()함수와 마찬가지로 많이 쓰이는 함수입니다.
    man strcpy 로 보시면 프로토타입등 상세한 설명을 보실 수 있습니다.

  • 프로토타입을 보면
    char *strcpy(char *dest, const char *src);
    두번째 인자 src를 첫번째 인자 dest로 복사하는 함수입니다. 주의할점은 src는 문자열이어야 합니다.
    src의 값에서 null(0x00)일때 까지 dest로 복사합니다. 만약 src가 문자열이 아닌 경우 문제가 발생할 수 있습니다.
    그러니 문자열의 개념은 반드시 알아두셔야 합니다. 반드시 null(0x00)값을 끝나야 합니다.
    첫번째 인자 dest의 크기는 src보다 반드시 크거나 같아야 합니다.
  • strcpy()함수를 사용하면 복사된 변수도 문자열이 됩니다.
    printf()함수에서 %s 서식으로 출력 가능합니다.

3-4) 문자열 관련 함수 예제 프로그램

    ▶ vi str2.c

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

void main() {
    char str[] = "Hello, World";
    char buf[32];
    int len;

    // str의 내용을 buf로 복사함
    strcpy(buf, str);

    // 문자열의 크기를 구하는 함수
    len = strlen(buf);

    printf("buf:[%s] 길이:[%d]\n", buf, len);
}

    ▶ 컴파일/실행

~/c-lecture (master ✘)✭ ᐅ gcc -o str2 str2.c
~/c-lecture (master ✘)✭ ᐅ ./str2
buf:[Hello, World] 길이:[12]
~/c-lecture (master ✘)✭ ᐅ

    ▶ 분석

  • 문자열 함수중 많이 사용하는 strlen()함수를 알아보겠습니다.
    함수 이름에서 알수 있듯이 문자열의 길이(크기)를 구하는 함수입니다.
    문자열의 길이는 null문자가 제외된 길이입니다.
    man strlen 으로 보시면 좀 더 상세히 보실 수 있습니다.
  • strcpy()와 같이 strlen()함수도 알아 두세요.

※ 개발을 하다 보면 memcpy(), strcpy() 등 관련된 함수가 상당히 많이 사용됩니다.
    강의를 진행하면서 언제 어떻게 사용되는 자세히 알아 보도록 하겠습니다.
※ 이번 강의에서는 memcpy(), strcpy()함수 함께 문자열을 개념을 다시 한번 잘 이해하시기 바랍니다.
    상당히 중요한 개념입니다.

반응형

'리눅스 C-언어 초급과정' 카테고리의 다른 글

17. 구조체와 포인터  (0) 2022.11.21
16. 구조체(struct)  (0) 2022.11.21
14. 함수 파라메타 유형  (0) 2022.11.17
14. 함수  (0) 2022.11.16
13. 포인터  (0) 2022.11.16
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/08   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함