본문 바로가기

C언어

11월 19일 C언어 문자열을다루는배열,문자열을 가리키는 포인터의 배열

8.5 문자열 함수들

*signed, unsigned
#include <stdio.h>

int main()
{
  char A=0x7F; //7은 0100이므로 앞이 0이므로 7F가 출력되지만
  char B=0x8F; //8은 1000 이므로 앞이 1 이므로 남은 4바이트 를 1로 다채워서(부호확장) FFFFFF8F로 출력이 된다
  char C=0xFF;
  
  unsigned char A1=0x7F; //unsigned 형이 속도가 빠르다, signed 는 부호확장시에 +,-체크를 해야하므로 
                             unsigned 에 비해 느린것이다.
  unsigned char B1=0x8F;
  unsigned char C1=0xFF;
  printf("%X,%X,%X\n",A,B,C);

  printf("%X,%X,%X\n",A1,B1,C1);
  return 0;
}

unsigned int 는 길어서 쓰기가 불편하므로 
typedef unsigned int uint_t; 로 정의 하여 사용하면 된다.
typedef는 앞에 #이없고 뒤에 ; 있으므로 전처리 언어가 아니고 C컴파일언어이다.
약속으로 typedef정의를 하면 만든 변수 뒤에 _t를 붙인다.

strncpy 함수원형 - 리눅스

STRCPY(3)            리눅스 프로그래머 매뉴얼           STRCPY(3)

 

NAME

       strcpy, strncpy - 문자열 복사하기.

 

SYNOPSIS

       #include <string.h>

 

       char *strcpy(char *dest, const char *src);

 

       char *strncpy(char *dest, const char *src, size_t n);

 

DESCRIPTION

       strcpy()  함수는 src(`\0' 문자를 포함)가 가리키는 문자열을

       dest가 가리키는 배열에 복사한다.  문자열을 겹쳐지지 않으며

       목적지 문자열 dest는 복사 받을 정도로 충분히 커야 한다.

 

       strncpy()   함수는   src   n바이트만을  복사한다는  것을

       제외하고 비슷하다.  만일  src  처음  n  바이트중  null

       없다면, 결과는 null-종료가 안될수 있다.

 

       src    길이가  n보다  작은 경우, dest 의 나머지는 null

       패드된다.

 

RETURN VALUE

       strcpy() strncpy()  함수는  목적지  문자열  dest  대한

       포인터를 반환한다.


..dest = destination

..scr = source


char *strncpy(char *dest, const char *src, size_t n); 

에서 두번째 인자가 const char 형 이므로 함수 내부적으로 두번째 인자를 수정 하지 않겠다는 말이다.

함수 원형에서 그 함수에 대한 모든 정보가 다 들어가 있음을 숙지하자


(8)atoi

alphanumeric to integer 에서 나온 말로 문자열을 정수로 변환 시킨다.


8.6 문자열을 다루는 배열

문자열의 배열을 2차원 배열로 구성하는 경우를 살펴본다.

//문자열을 다루는 배열
#include <stdio.h>
#include <string.h>
#define MAXSTD 5
#define NAMELEN 15


int main()
{
  int i, yes=0;
  char name[NAMELEN];
  char student[MAXSTD][NAMELEN]={"Michael Bolton","Richard Marx","Ricky Martin","Celin Dion","Cutting Crew"};

  for(i=0;i<5;++i)
  {
    printf("%p \t%s\n",student[i],student[i]);
  }
  printf("Enter student name: ");
  gets(name);

  for(i=0;i<MAXSTD;++i)
  {
    if(strcmp(student[i],name)==0
    {
      yes=1;
    }
  }
  if(yes)
  {
    printf("Yes,%s is a student in CS department\n",name);
  }
  else
  {
    printf("NO,%s is not a student in CS department\n",name);
  }

  return 0;
}
    

8.7 문자열을 가리키는 포인터의 배열

#include <stdio.h>
#include <string.h>
#define MAXSTD 5

int main()
{
  int i,yes=0;
  char name[15];

  char *student[MAXSTD]={"Michael Bolton","Richard Marx","Ricky Martin","Celin Dion","Cutting Crew"};
  //char* 5개 이며 {}안의 이름("Michael Bolton") 각각의 주소값이 들어가 있다 
  printf("Enter student name :");
  gets(name);

  for(i=0;i<MAXSTD;++i)
  {
    if(strcmp(student[i],name)==0)
    {
      yes=1;
    }
  }
  if(yes)
  {
    printf("Yes %s is a student in CD department\n",name);
  }
  else
  {
    printf("No, %s is not a student in CS department\n",name);
  }
  return 0;
}



//문자열 포인터를 이용하여 이름을 알파벳순으로 정렬하는 프로그램
#include <stdio.h>
#include <string.h>
#define MAXSTD 5
#define NAMELEN 15

int main()
{
  char student [MAXSTD][NAMELEN];
  char *stptr[MAXSTD];
  char *temp;
  int i,j,count=0;

  printf("Please enter name of student :\n");

  while(count<MAXSTD)
  {
    printf("Student %d : ",count +1);
    gets(student[count]);
    stptr[count++]=student[count];
  }

  for(i=0;i<count-1;++i)
  {
    for(j=i+1;j<count;++j)
    {
      if(strcmp(stptr[i],stptr[j])>0)
      {
        temp=stptr[j];
        stptr[j]=stptr[i];
        stptr[i]=temp;
      }
    }
  }
  printf("\nStudent List : \n");
  for(i=0;i<count;++i)
  {
    printf("Student %d: %s\n",i+1,stptr[i]);
  }

  return 0;
}

알파벳순으로 정렬되어 있다.--->데이타 베이스 

위치조정시에는 배열을 통채로 바꾸는 것보다 포인터를 사용하는 것이 좋다.
파일은 저장된 값이 변하지 않고 정렬할때 만 주소로 바꾸어서 표현하는 것이다.