저수준 file 입출력의 read/write –disk user가 설정한 buffer에서 자료를 읽고쓴다.

Buffer file입출력의 getc/putc  fgets/fputs

-       시스템이 설정한 buffer 와 user가 정한 변수와의 사이에서 자료를 읽고 쓴다

-       Buffer disk간의 자료를 읽고 쓰는 것은 시스템이 필요에 따라서 (buffer empty  full일 때)자동적으로 행한다

입출력 함수 분류표

   

   

    

(메모리내)

문자열

저수준

 

표준파일

(표준 입출력에 대한 I/O)

스트림파일

(file 입출력에 대한 I/O)

바이너리파일

문자

입력

getchar()

getc(stream)

 

 

gfetc(stream)

 

 

출력

putchar()

putc(c,stream)

 

 

fputc(c,stream)

 

 

unget(c,stream)

 

 

입력

(stdin 으로 부터 문자열을str로 시작되는 버퍼에 읽어드린다)

\n 대신에 \0가 부가되어 저장

gets(str)

fgets(buf, max, stream)

 

read(fd, buf,nbyte)

단어

getw(stream)

 

블록

fread(ptr, size, nitems,stream)

 

출력

(str로 보인 버퍼에 기억된 문자열을stdout에 출력한다.)

\0 을 만나면\n으로 바꿔서 출력

puts(str)

fputs(buf, stream)

 

write(fd, buf,nbyte)

단어

putw(w,stream)

 

블록

fwrite(ptr, size, nitems,stream)

 

레코드

입력

scanf(format,[args])

fscanf(stream, format,[args])

sscanf(str, format,[args])

 

출력

printf(format,[args])

fprintf(stream, format,[args])

sprintf(str, format,[args])

 

파일

열기

(자동)

fopen(filename,mode)

 

 

freopen(filename,mode,stream)

 

 

fdopen(fd,mode)

 

 

닫기

(자동)

fclose(stream)

 

 

fflush(stream)

 

 

탐색

(자동)

fseek(stream,offset,mode)

 

open

ftell(stream)

 

close

rewind(stream)

 

lseek(fd,offset, mode)

 

사용자정의 자료형

struct 구문 자체는 메모리에 존재하지 않음(서술 or 설명 : ex 인간)
ex)
struct TEST
{
    int iNum;
    char cNum;
}

int main()
{
     struct TEST TS;
     struct TEST ST;

     TS.iNum = 1;
     ST.iNum = 5;

      printf("TEST iNum : %d", TS.iNum);
      printf("TEST iNum : %d", ST.iNum);
      return 0;
}
TS.iNum 과 ST.iNum은 다르다.
C에서는 struct를 반드시 적어주어야 한다. (
struct TEST TS;)
struct를 안쓰고싶을경우는 typedef정의를 해주면된다. 
ex) typedef struct TEST
{
    int iNum;
    char cNum;
} TEST_t;
위에 처럼 정의해주면 struct를 안쓰고 TEST_t TS; 로 하는 방법도 있다.
물론 struct TEST TS;도 사용가능하다.

C++생략 가능 (TEST TS;)



int main(int argc, char **argv) 
{ 
    int a[5][10]; 
 
    printf("rows : %d\n",sizeof(a)/sizeof(a[0])); 
    printf("cols : %d\n", sizeof(a[0])/sizeof(int)); 
    return 0; 
} 
 
실행결과
$ ./sizeof 
rows : 5 
cols : 10 

표준 C 라이브러리에는 문자열에 관련된 다양한 함수를 제공한다.

 

여기서는 string.h 헤더 파일에 선언되어 있는 문자열 관련 함수들 중에서 일반적으로 사용 빈도가 높은 몇몇 함수들에 대해서 소개하겠다.

 

자주 쓰는 것으로는

 

(1) strlen() : 문자열의 길이

(2) strcat() / strncat() : 문자열의 결합

(3) strcmp() / strncmp() : 문자열의 비교

(4) strcpy() / strncpy() : 문자열의 복사

 

 

<strlen>

 

  문자열의 길이를 가져오는 아주 유용한 녀석이다.

 

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

  void main()
  {
    int length;
    char arr[] = "Test";

    length = strlen(arr);

    printf("문자열의 길이 : %d\n",length);
  }

 

  

 

  Null을 제외하고 순수한 문자열의 길이를 가져온다. 이 점에 유의하자.

 

 

<strcat>

 

  두 개의 문자열을 결합한다.

 

  #include<stdio.h>
  #include<string.h>
  void main()
  {
    char buf[20]="superman";
    char buf1[10]="&batman";


    strcat(buf,buf1);
    printf("%s\n",buf); 
  }

 

  

 

 

<strncat>

 

  간단하다. 뒤에 숫자만 붙이면 된다.

  n이 의미하는 바는 사용자가 원하는 길이만큼 복사해준다는 뜻이다.

 

  strncat(첫번째 문자열, 두번째 문자열, 두번째 문자에서 원하는 길이)

 

  #include<stdio.h>
  #include<string.h>
  void main()
  {

    char buf[20]="superman";
    char buf1[10]="&batman";


    strncat(buf,buf1,5);
    printf("%s\n",buf); 
  }

 

  그러면 5번째까지만 할 것이니까, &batm까지만 결합될 것이다.

 

  

 

 

<strcmp>

 

  문자열 비교를 해준다.

 

  #include<stdio.h>
  #include<string.h>
  void main()
  {
    char buf[20]="superman";
    char buf1[10]="superwoman";
    
    printf("%d\n",strcmp(buf,buf1)); 
  }

 

  

 

  같으면 0을 리턴해주고, 다른 경우에는 -1과 1을 리턴해주는데, 1과 -1의 차이는 이렇다.

 

  -1 : 첫 번째 문자열이 두 번째 문자열보다 알파벳 순서로 앞에 올 경우 (ex) A와 B를 비교

  -1 : 첫 번째 문자열이 두 번째 문자열보다 알파벳 순서로 뒤에 올 경우 (ex) B와 A를 비교

 

 

<strncmp>

 

  역시 비교를 하긴 하는데 사용자가 원하는 길이, n만큼 비교를 하는 것이다.

 

  #include<stdio.h>
  #include<string.h>
  void main()
  {
    char buf[20]="superman";
    char buf1[10]="superwoman";
    
    printf("%d\n",strncmp(buf,buf1,5)); 
  }

 

  

 

  strncmp(첫번째 비교대상, 두번째 비교대상, 두 문자열의 비교하고자 하는 길이)

 

 

<strcpy>

 

  문자열을 복사하는 함수이다.

 

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

  void main()
  {
    char buf[10]="superman";
    char buf1[10];
 
    strcpy(buf1,buf);
    printf("%s\n",buf1);
  }

 

  

 

 

<strncpy>

 

  원하는 길이만큼 복사한다.

 

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

  void main()
  {
    char buf[10]="superman";
    char buf1[10];
 
    strncpy(buf1,buf,5);
    buf1[5]='\0'; //쓰레기 값을 초기화 시켜준다
    printf("%s\n",buf1);
  }

 

  

 

 

<문자 및 문자열에 관련된 그 밖에 함수들>

 

  지금까지 문자열에 관련된 많은 함수를 보았다. 그러나 이것 이외에도 많은 양의 문자열 관련 함수들이 존재한다.

 

  그 모든 것을 여기에 소개하는 것은 의미가 없다. 그렇다면 나머지 함수는 어떻게 공부해야 하는가?

 

  이런 경우에 필요한 것이 레퍼런스(Reference)이다.

 

 

  모든 함수들을 외우고 다닐 수도 없는 노릇이고, 또 어느 경우에 유용한 함수인지도 모르는 상태에서

 

  무작정 함수만을 공부하는 것도 적절한 공부 방법이 아니다. (사실 이런 함수 공부보다 포인터 확실히 이해하는 것이 훨씬 낫다)

 

  자주 쓰이지 않는 함수들은 필요한 경우에 참조해 볼 수 있으면 된다. 사실 찾는 것도 실력이다.

 

 

  서점에서 적절한 C언어 레퍼런스를 하나 구입하자. 아주 중요한 사실이기에 말씀드리고 있는 것이다.

 

  열혈강의 윤성우 저자는 'Prentice Hall'에서 출간한 'A Reference Manual'과 프리렉의 C Programming : 완벽가이드를 추천하고 있다.

 

 

<문자열을 숫자로 변환하는 함수들>

 

  다음 함수들은 모두 인자로 문자열을 전달하면 해당 문자열을 숫자로 변환해서 리턴해 준다. 헤더 파일은 stdlib.h이다.

 

  -------------------------------------------------------

  int atoi(char *ptr); // 문자열을 int형 데이터로 변환

  int atoi(char *ptr); // 문자열을 long형 데이터로 변환

  double atof(char *str); // 문자열을 double형 데이터로 변환

  -------------------------------------------------------

 

  다음에 소개되는 예제는 숫자를 표현하는 두 개의 문자열을 정수형 데이터로 변환하여 덧셈을 하는 간단한 예제이다.

 

  #include<stdio.h>
  #include<stdlib.h>

  void main()
  {
    char * str1 = "123";
    char * str2 = "321";

    printf("123+321 : %d", atoi(str1) + atoi(str2));
  }

 

  

 

 

<대소문자의 변환을 처리하는 함수들>

 

  -------------------------------------

  #include<ctype.h>

  int toupper(int c); // 소문자를 대문자로

  int tolower(int c);  // 대문자를 소문자로

  -------------------------------------

 

  다음 예제는 사용자로부터 입력받은 문자열 (길이가 30을 넘지 않는다고 가정)의 대소문자를 변환하는 예제이다.

  즉 입력된 문자열이 "ABcd"라면 출력은 "abCD"가 되어야 한다.

 

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

  void convert(char * str);

  void main()
  {
    char str[30];

    printf("Enter a string : ");
    fgets(str, sizeof(str), stdin);

    convert(str);
    printf("convert sting : %s", str);
  }

  void convert(char * str)
  {
    int i;
    for(i=0; i<strlen(str); i++)
    {
      if(str[i]>=65 && str[i]<=90)
        str[i] = tolower(str[i]);

      else if(str[i]>=97 && str[i]<=122)
        str[i] = toupper(str[i]);

      else
        continue;
    }
  }

 

  

+ Recent posts