달력

42025  이전 다음

  • 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


memcmp() 함수는 메모리 영역 s1과 s2의 처음 n 바이트를 비교한다. 이 함수는 s1 이 s2 보다 작으면 0보다 작은 정수, 같으면 0, 크면 0보다 큰 정수를 반환한다.

1. 사용법
#include <string.h>

int memcmp(const void *s1, const void *s2, size_t n);

2. 예제
#include <string.h>
#include <unistd.h>
#include <stdio.h>

typedef struct __person
{
    int  age;
    char name[12];
} person;

int main()
{
    person a, b;
    int state;

    a.age = 28;
    strncmp(a.name, "yundream", 11);

    b.age = 24;
    strncmp(a.name, "gim", 11);

    // a 와 b 의 처음 8 바이트를 비교한다. 
    state = memcmp((void *)&a, (void *)&b, 8);
    if (state < 0)
    {
        printf("b older than a\n");
    }
    else if(state == 0)
    {
        printf("same same\n");
    }
    else
        printf("a older than b\n");

    return 0;
}

'C' 카테고리의 다른 글

C 프로그램 지역변수.전역변수.정적변수 외부변수  (0) 2009.03.03
gcc 컴파일 옵션  (0) 2008.07.16
make  (0) 2008.06.04
[함수] sprintf - 출력  (0) 2008.05.16
[함수] memcpy - 메모리카피  (0) 2008.05.16
Posted by marryjane
|

http://simple21.egloos.com/2559467

#include <memory.h> or <string.h>
void *memcpy(void *dest, const void *src, size_t count);

memory를 copy하는 함수로써, 매우 자주 사용한다.
대부분은 잘 알고 있겠지만, 아래의 세 가지 예를 살펴보도록 하자.
- 동일한 데이터 형에 대한 사용한 예
- 동일하지 않는 데이터 형에 대한 사용한 예
- Bit Field에 사용한 예

1.동일한 데이터 형에 대한 사용한 예
100개의 배열변수 a2의 값을 a1에 assign하려면, 가장 쉬운 방법은
double a1[100], a2[100];
for(int i=0; i<100; i++) a1[i] = a2[i];

이를 memcpy를 이용하면, 간단하고, 처리속도도 매우 빠르다.
memcpy(a1, a2, sizeof(double)*100);

대부분 이러한 목적으로 많이 사용한다. 하지만 메모리의 일부만을 copy하는 경우에도 많이 사용된다. 예를 들어, src_width, src_height의 src_data에서 일부영역 des_x, des_y, des_width, des_height의 데이터를 des_data에 넣고자 한다면,(이때 data는 unsigned char, 1차원 배열, gray-raw data라고 가정하면)

src_index = des_y*src_width+des_x;
des_index = 0;
for(int y=0; y<des_height; y++) {
    memcpy(des_data+des_index, src_data+src_index,
        sizeof(unsigned char)*des_width);
    des_index += des_width;
    src_index += src_width;
}
하면 된다. 위, 예제소스는 간단하다. 특별히 설명할 것도 없다. 하지만, 정확하게 어떻게 동작하는지 정도는 반드시 알고 있어야 한다. 메모리 전체 또는 일부에 대한 처리방법은 src와 des 각각의 처리할 시작주소와 count만 올바르게 넘겨주면 된다. 일부의 영역을 처리하는데 잘 이용을 해보기를 바란다.

2.동일하지 않는 데이터 형에 대한 사용한 예
통신 프로그램의 경우 다양한 데이터형의 자료를 전송하거나, 받는다. 이때 일반적으로 unsigned char형의 데이터에 담아서 주고받는다. 이러한 경우 unsigned char형의 데이터에 다양한 데이터형의 자료를 담아서 전송하거나, 받는 부분을 처리하게 된다.
만일
char c[10];
int a;
double f[5];
를 전송한다고 하면,

//send...
int item_size = 0, m_index=0;
unsigned char* data = new unsigned char[sizeof(char)*10+
    sizeof(int)+sizeof(double)*5)];
item_size = sizeof(char)*10;
memcpy(data, c, item_size);
m_index += item_size;
item_size = sizeof(int);
memcpy(data+m_index, &a, item_size);
m_index += item_size;
item_size = sizeof(double)*5;
memcpy(data+m_index, f, item_size);

//receive
int item_size = 0, m_index=0;
item_size = sizeof(char)*10;
memcpy(c, data, item_size);
m_index += item_size;
item_size = sizeof(int);
memcpy(&a, data+m_index, item_size);
m_index += item_size;
item_size = sizeof(double)*5;
memcpy(f, data+m_index, item_size);

이를 더욱 간단하게 처리를 한다면,
#pragma pack(1)
struct {
   char c[10];
   int a;
   double f[5];
} _packet;
#pragma pack()

unsigend char* data = new unsigned char[sizeof(_packet)];
memcpy(data, &_packet, sizeof(_packet));
으로 하면 되고, 이때 주고받는 쪽의 struct member alignment를 잘 고려해야한다.

이번시간에는 다양한 데이터 형을 한 가지 데이터 형에 어떻게 넣고 빼는지를 살펴보는 것이 매우 중요하다.

'C' 카테고리의 다른 글

gcc 컴파일 옵션  (0) 2008.07.16
make  (0) 2008.06.04
[함수] sprintf - 출력  (0) 2008.05.16
[함수] scanf - 문자입력받기  (0) 2008.05.15
[함수] printf - 표준출력  (0) 2008.05.15
Posted by 알 수 없는 사용자
|

scanf("변환문자", 인수1,인수2...);
- 일반 변수를 인수로 사용할 때는 인수 앞에 주소 연산자인 & 기호를 사용해야 한다.
- 여러개의 데이터를 입력할 때 데이터의 구분은 공백과 엔터키로 구분한다.
- 변환문자는 입력자료의 형(Type) 을 지정
- 인수의 주소는 입력자료가 기억될 변수의 주소를 나타내며, 변환문자의 갯수와 같아야 함.

ex) scanf("%d %d",&num1,&num2); /*정수값 두개를 입력받아 num1과 num2에 저장한다. */
char name[15],c;
scanf("%s %c",name,&c);
=> scanf() 함수에서 단일 문자 변수 앞에는 &연산자를 붙여야 하지만 문자배열에서는 &기호를 생략한다. 배열의 이름자체가 주소값을 나타내므로 생략가능한 것이다. 문자배열의 맨 마지막에는 null문자가 자동적으로 입력된다.

예제 2 )
/* scanf()를 사용하여 두 정수값을 입력받아 덧셈 연산하기 */
#include<stdio.h>
void main(){
int a,b,sum;
printf("input two numbers :");
scanf("%d %d",&a,&b); /* 정수 두개를 입력받아 변수 a와 b에 저장한다. */
sum=a+b;
printf("sum of two numbers : %d\n",sum);
}

예제 3)
#include<stdio.h>
main()
{
int x;
float y;
char ch1, ch2[30];
printf("10진정수, 실수, 단일문자, 문자열을 입력하시오 ! \n");
scanf("%d %f %c %s",&x, &y, &ch1, ch2);
printf("10진정수 :%d, 실수 :%f, 단일문자 :%c, 문자열 :%s\n",x, y, ch1, ch2);
}

'C' 카테고리의 다른 글

gcc 컴파일 옵션  (0) 2008.07.16
make  (0) 2008.06.04
[함수] sprintf - 출력  (0) 2008.05.16
[함수] memcpy - 메모리카피  (0) 2008.05.16
[함수] printf - 표준출력  (0) 2008.05.15
Posted by 알 수 없는 사용자
|