jam 블로그

[C] 21. 문자와 문자열 처리 함수 본문

개발 및 관련 자료/C

[C] 21. 문자와 문자열 처리 함수

kid1412 2013. 5. 12. 19:46
728x90

I. 스트림과 데이터의 전송

  • 입.출력에 대한 이해

    • 말그대로 입력과 출력이 무엇인가에 대해 설명 하는거라 pass 하겠다.

 

  • 입.출력이 가능한 이유는 어디에

    • 여기도 간단하게 몇개만 쓰겠다.

      • 표준 입력 스트림 : stdin
      • 표준 출력 스트림 : stdout
      • 표준 에러 스트림 : stderr
      • 스트림 이란 

        • 연속된 데이터의 열을 의미한다.

 

II. 문자 단위 입.출력 함수

  •  문자 출력 함수

    • 하나의 문자를 출력할 때 일반적으로 putchar와 fputc함수이다.

      • putchar : int putchar(int c); 이 함수원형이며 함수 호출시 인자로 받은 문자를 표준출력스트름(대략 모니터) 으로 출력을해준다.
      • fputc : int fputc(int c, FILE* stream) 이 함수원형이며, 기본적으로는 putchar와 같으나 차이점은 문자를 출력할 스트림을 지정할 수 있다는 특징을 가지고 있다. 대부분 파일입출력에 많이 쓰인다.
  • 문자입력 함수

    • 하나의 문자를 입력 받을때 일반적으로 getchar와 fgetc를 사용한다.

      • getchar : int getchar() 가 기본형이며 표준입력스트림(대략 키보드)으로부터 한 문자를 입력 받아서 반환해주는 함수이다.
      • fgetc : int fgetc(FILE* stream) 가 기본형이며 getchar와 같은 기능이며 문자를 입력받을 스트림을 지정할 수 있다는 특징이다. 파일로부터도 데이터를 입력받을수 있기 때문에 파일입출력에서 많이 쓰인다.
  1.  #include <stdio.h>
  2. int main()
    {
     char ch = 0;
     while(ch != 'q')
     {
      ch = getchar();
      putchar(ch);
  3.  }
     return 0;
    }
  • 위의 소스는 getchar와 putchar를 사용한 것이다.

 

  • EOF에 대해서

    • fgetc나 getchar 함수가 파일의 끝에 도달하는 경우에도 EOF가 반환
  1. #include <stdio.h>
  2. int main()
    {
     char ch = 0;
     while(ch != EOF)
     {
      ch = getchar();
      putchar(ch);
  3.  }
     return 0;
    }
  • 위의 소스에서 EOF 발생 할때 까지 입력 받는다.

    • EOF 발생 하려면 ctrl + z or ctrl +c 같은 걸 누르면 된다.

 

  • 문자 단위 입출력 함수가 존재하는 이유!  

    • 책을 읽어보세요

 

III. 문자열 단위 입출력 함수

  • 문자열 출력함수

    • puts : int puts(const char* s)이 함수원형이며 문자열을 표준 출력스트림으로 출력하기 위해 사용하는 함수이다.
    • fputs : int fputs(const char* s, FILE* stream)이 함수원형이며 문자열을 출력할 스트림을 선택할수 있으며 puts와 같다.
  1.  #include <stdio.h>
  2. int main()
    {
     fputs("fputs 함수에 의한 출력,",stdout);
     fputs("I asd",stdout);
     fputs("\n",stdout);
  3.  puts("puts 함수에 의한 출력,");
     puts("i asdf?");
    return 0;
    }
  • 참고로 fputs는 출력을 하는 경우 자동으로 줄바뀜이 안되지만 puts는 자동으로 줄이 바뀌어 진다.

 

  • 문자열 입력 함수

    • gets : char* gets(char* s)가 기본형이며 문자열을 입력받는 함수이다. 우선 입력받을 문자열을 저장하기 위한 배열을 선언한다음, 배열의 시작주소를 인자로 전달하면서 gets함수를 호출하게 된다. 다만 이 함수는 사용을 자제 하자
    • fgets : char* fgets(char* s,int n, FILE* stream)이 기본형이며, gets와 비슷한 기능을 한다. 입력받을 수 있는 최대 문자열의 길이 n을 초과하는 문자열이 입력되는 경우 n-1개까지의 문자만 입력을 받고 마지막에 NULL 문자를 삽입해 준다.

 

IV. 표준 입출력과 버퍼

  • 표준 입출력 기반의 버퍼

    • 표준 입출력 함수를 사용하는 경우에는 버퍼라는 것을 제공받게 된다.
    • 버퍼란 여분의 임시 메모리 공간이라고 생각을 하면 된다.

 

  • 버퍼링을 하는 이유는 무엇인가?

    • 책참조하세요

 

  • 버퍼를 비우는 작업을 하는 fflush 함수

    • fflush : int fflush(FILE* stream)이 함수 원형이며 함수의 인자로 전달되는 스트림의 버퍼를 비워버린다.
  1. #include <stdio.h>
  2. int main()
    {
     char perID[7];
     char name[10];
  3.  fputs("주민등록번호 앞 6자리 입력",stdout);
     fgets(perID,sizeof(perID),stdin);

  4.  fflush(stdin);
  5.  fputs("name : ",stdout);
     fgets(name,sizeof(name),stdin);
  6.  printf("주민등록번호 : %s\n",perID);
     printf("이름 : %s\n",name);
     return 0;
    }
  • fflush를 주석처리 했을때와 안했을 때의 차이를 보면 안했을 때에는 문자가 배열 크기보다 넘어가면 이름을 치지도 못하고 그 넘은 만큼의 문자가 들어가 버린다.

    • 이것을 대비하기 위해서 fflush 를 쓴것이다.

 

V. 문자열 조작함수

  •  문자열의 길이를 반환하는 strlen 함수

    • strlen : #include<string.h> size_t strlen(const char* s)가 함수 원형이며 인자로 문자열의 포인터를 전달받고 문자열의 길이를 계산하여 반환하되 null은 포함되지 않는다.
  1.  #include <stdio.h>
    #include <string.h>
  2. int main()
    {
     char str[100];
  3.  while(1)
     {
      fgets(str,sizeof(str),stdin);
      printf("길이 : %d\n",strlen(str));
     }
     return 0;
    }
  • 위의 소스를 컴파일후 실행시켜 해보았을 때 123 이라 넣으면 4라고 찍히는데 3이 아닌 4일까?

    • 이유는 엔터키까지 포함하였기 때문이다.

 

  • 문자열을 복사하는 strcpy와 strncpy 함수

    • strcpy 함수 : #include<string.h> char* strcpy(char* dest, const char* src)가 함수 원형이며 dest로 전달된 배열에 src로 전달된 문자열을 복사한다.
  1. #include <stdio.h>
    #include <string.h>
  2. int main()
    {
     char str1[10] = "12345678";
     char str2[10];
  3.  printf("원래 문장 : %s\n",str1);
  4.  strcpy(str2,str1);
  5.  printf("새로운 문장 : %s\n",str2);
     return 0;
    }

 

  • strncpy

    • #include<string.h> char* strncpy(char* dest, const char* src, size_t n);이 함수 원형이며 strcpy와 같은 기능이며 즉 src로 전달된 문자열을 dest로 전달된 배열에 복사를 한다.  단 복사하는 문자열의 최대 길이는 n을 넘지 않는다.
  1.  #include <stdio.h>
    #include <string.h>
  2. int main()
    {
     char str1[10] = "12345678";
     char str2[5];
  3.  printf("원래 문장 : %s\n",str1);
  4.  strncpy(str2,str1,sizeof(str2)-1);
     str2[sizeof(str2)-1] = '\0';
  5.  printf("새로운 문장 : %s\n",str2);
     return 0;
    }

 

  • 문자열을 추가하는 strcat와 strncat

    • strcat : #include<string.h> char* strcat(char* dest, const char* src); 가 함수원형이며, src로 전달된 문자열을 첫번째 전달 인자인 dest로 전달된 문자열의 뒤에 추가하는 기능이다.
    • strncat : #include<string.h> char* strncat(char* dest, const char* src, size_t n)이 함수 원형이며, strcat과 같은 기능인데 복사 하고자 하는 문자열의 최대 길이를 인자로 전달하는 기능을 더불어 지니고 있다.
  1.  #include <stdio.h>
    #include <string.h>
  2. int main()
    {
     char str1[35] = "Your favorite language is ";
     char str2[10];
     char *str3 = "12345";
     char str4[10]= {0,};
  3.  fputs("What is your favorite computer language ? :",stdout);
     fgets(str2,sizeof(str2),stdin);
  4.  strcat(str1,str2);
  5.  printf("strcat 생성된 문자열 : %s\n",str1);

  6.  strncat(str4,str3,strlen(str3));
  7.  printf("strncat 생성된 문자열 : %s\n",str4);
  8.  return 0;
  9. }

 

  • 문자열을 비교하는 strcmp 그리고 strncmp 함수

    • strcmp : #include<string.h> int strcmp(const char* s1, const char* s2);이 함수 원형이며 두 개의 문자열 포인터를 인자로 받아서 포인터가 가리키는 문자열의 내용 비교를 한다.
    • strncmp : #include<string.h> int strncmp(const char* s1, const char* s2, size_t n)이 함수 원형이며 strcmp와 같은 기능이며 비교할 문자의 길이를 절달 받아서 비교한다.
  1.  #include <stdio.h>
    #include <string.h>
  2. int main()
    {
     char* str1 = "ABCDase";
     char* str2 = "ABCDEFG";
  3.  int result,result1;
     result = strcmp(str1,str2);
     result1 = strncmp(str1,str2,3);
     if (result == 0)
      printf("두 문자열은 같다.\n");
     else
      printf("두 문자열은 다르다.\n");
     if (result1 == 0)
      printf("두 문자열은 부분적으로 일치\n");
     else
      printf("두 문자열은 전혀 다르다.\n");
  4.  return 0;
    }
  •  문자 및 문자열에 관련된 그밖에 함수들

    • 문자열을 숫조라 변환하는 함수들
    • atoi : #include<stdlib.h> int(long,double) atoi(char *ptr)이 함수 원형이며 문자열을 숫자로 변환해서 리턴해준다.
  1.  #include <stdio.h>
    #include <stdlib.h>
  2. int main()
    {
     char* str1 = "123";
     char* str2 = "321";
  3.  printf("123 + 321 : %d\n",atoi(str1)+atoi(str2));
     return 0;
    }

 

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

    • toupper :  #include<ctype.h> int toupper(int c)이 함수 원형이며 소문자를 대문자로 바꾸어 준다.
    • tolower : #include<ctype.h> int tolower(int c)이 함수 원형이며 대문자를 소문자로 바꾸어 준다.
  1.  #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
  2. void convert(char *str);
  3. int main()
    {
     char str[30];
  4.  printf("Enter a string : ");
     fgets(str,sizeof(str),stdin);
  5.  convert(str);
     printf("convert string : %s\n",str);
  6.  return 0;
    }
  7. 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;
     }
    }
Comments