본문 바로가기

C언어/함수설명&Tip

[C] 문자열 조작 함수 (strlen, strcat, strcmp, strcpy)

표준 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;
    }
  }