본문 바로가기
프로그래밍/C & C++

[C] 문자열 처리함수

by 불타는홍당무 2016. 3. 22.

출처: sciphy.tistroy.com/44, http://forum.falinux.com/



<string.h> 헤더파일이 필요 (#include <string.h>)

 


1. 문자열 복사하기 


형태  char *strcpy(char *str1, const char *str2)

str2의 내용을 str1으로 복사한다이 때 str2는 반드시 널(null) 문자로 끝나는 문자열의 포인터이어야 한다strcpy() str1의 포인터(시작주소)를 반환한다.

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

char arr1[50];

strcpy(arr1, “Hello! Nice to meet you.”);

      printf("arr1: %s", arr1)


char arr2[50];

printf("arr: %s", strcpy(arr2, “Hello! Nice to meet you.”));


return 0;

}

*만약 arr = “Hello! Nice to meet you.”라는 코딩을 했다면 이는 에러이다. 원인은 다음과 같다.

첫번째 줄의 배열 선언에서메모리 100바이트를 잡는다.

- arr은 그 메모리의 시작 주소이다(상수로서 이후엔 변경불가)

두번째 줄에서 우선 문자열상수 “Hello Nice to meet you.”를 어딘가에 저장한다.

그 주소를 arr에 대입하려고 한다, arr를 그 주소로 포인팅하려고 하나, arr이 상수이므로 변경이 불가하여 에러가 난다.

 

 

2. 일부 문자열 복사하기 


형태  char *strncpy(char *str1, const char *str2, size_t n)

str2에서 일부 문자들만을 str1으로 복사한다. str2 에서 str1으로 str2의 처음 n개의 문자들 만을 복사(NULL 도 포함해서) 한다. n보다 str2의 문자 수가 더 적다면은 모자란 부분은 0 으로 생각되어서 str1에 복사가 된다. 다시 말해 str2가 "abc"이고 n이 5라면 str1에는 "abc\0\0" 가 들어가게 된다.  strncpy 함수는 복사시 destination 끝에 반드시 NULL 문자를 붙이는 것이 아니므로 개발자가 인위적으로 삽입해 주어야 한다. strcpy와 마찬가지고 str1의 포인터(시작주소)를 반환한다.

#include <stdio.h>

#include <string.h> int main() {

char arr1[50];

char arr2[] = "Nice to meet you.";


strncpy(arr1, arr2, strlen(arr2)+1);

printf("arr1: %s", arr1);


return 0;

}



3. 문자열 추가하기 


형태  char *strcat(char *str1, const char *str2)

문자열 str2의 복사본을 문자열 str1에 추가시킨다이 때 str1은 널(null) 문자로 끝난다문자열 str1의 끝에 잇던 원래의 널(null) 문자는 str2의 첫 번째 문자로 인해 겹쳐 써지며문자열 str2는 이 과정에서 변경되지 않는다경계 부분을 확인하지 않으므로str1이 원래의 내용과 str2의 내용을 모두 포함할 수 있을 만큼 str1의 메모리를 충분히 확보해야 한다물론 이는 전적으로 개발자의 몫이다.

#include <stdio.h>

#include <string.h> int main() {

char arr1[50] = "Hello ";

char arr2[] = "World";


strcat(arr1, arr2);

printf("arr1: %s %d", arr1, strlen(arr1));


return 0;

}



4. 일부 문자열 추가하기 


형태  char *strcat(char *str1, const char *str2, size_t n)

문자열 str2의 복사본을 문자열 str1에 추가시킨다. 이 때 str1은 널(null) 문자로 끝난다. 문자열 str1의 끝에 잇던 원래의 널(null) 문자는 str2의 첫 번째 문자로 인해 겹쳐 써지며, 문자열 str2는 이 과정에서 변경되지 않는다. 경계 부분을 확인하지 않으므로, str1이 원래의 내용과 str2의 내용을 모두 포함할 수 있을 만큼 str1의 메모리를 충분히 확보해야 한다. 물론 이는 전적으로 개발자의 몫이다.

#include <stdio.h> #include <string.h> int main() { char str[50] = "forum"; strcat( str, ".falinux.com"); printf( "%s\n", str);

return 0;

}



5. 문자열 길이 구하기


형태  int strlen(const char *str1)

str1이 가리키는 널(null)로 끝나는 문자열의 길이를 반환한다이 때 널(null) 문자는 포함되지 않는다즉 널 문자를 제외한 문자의 개수를 리턴한다.

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

   char *str = "Hello World";

   printf( "%d\n", strlen(str));

  

   char arr[] = "Hello World";

   printf( "%d\n", strlen(arr));


   return 0;

}

 


6. 문자열 비교하기


형태  int strcmp(const char *str1, const char *str2)

2개의 널(null) 문자로 끝나는 문자열을 사전식으로 비교하고그 결과에 따라 아래와 같은 의미를 갖는 정수를 반환한다보통 두 문자열이 일치하는지 확인할 때 주로 쓰인다.

반환  str1 str2보다 크면 양수, str1과 str2가 같으면 0, str1과 str2가 같으면 0

#include <stdio.h> #include <string.h> int main() { char str_apple[] = "apple"; char str_apple2[] = " apple"; char str_banana[] = "banana"; char str_appleII[]= "appleII"; printf( "%s with %s = %d\n", str_apple, str_apple , strcmp( str_apple, str_apple ) ); printf( "%s with %s = %d\n", str_apple, str_apple2 , strcmp( str_apple, str_apple2 ) ); printf( "%s with %s = %d\n", str_apple, str_banana , strcmp( str_apple, str_banana ) ); printf( "%s with %s = %d\n", str_apple, str_appleII, strcmp( str_apple, str_appleII) ); return 0; }



7. 일부 문자열 비교하기

 

형태  int strncmp(const char *str1, const char *str2, size_t n)

2개의 널(null) 문자로 끝나는 문자열을 사전식으로 비교하고, 그 결과에 따라 아래와 같은 의미를 갖는 정수를 반환한다. 보통 두 문자열이 일치하는지 확인할 때 주로 쓰인다.

반환  str1이 str2보다 크면 양수, str1과 str2가 같으면 0, str1과 str2가 같으면 0

#include <stdio.h>

#include <string.h> int main() { char str_apple[] = "apple"; char str_apple2[] = " apple"; char str_banana[] = "banana"; char str_appleII[]= "appleII"; printf( "%s with %s = %d\n", str_apple, str_apple , strncmp(str_apple, str_apple , 5) ); printf( "%s with %s = %d\n", str_apple, str_apple2 , strncmp(str_apple, str_apple2 , 5) ); printf( "%s with %s = %d\n", str_apple, str_banana , strncmp(str_apple, str_banana , 5) ); printf( "%s with %s = %d\n", str_apple, str_appleII, strncmp(str_apple, str_appleII, 5) ); return 0; }



8. 문자열에 포함되는 특정문자열 찾기


형태  char *strstr(const char *str1, const char *str2)

str1이 가리키는 문자열에서 str2가 가리키는 문자열과 처음 일치하는 곳의 위치포인터를 반환한다(이 때 str2의 마지막 널(null) 문자는 제외된다).  만약 일치하는 것이 없을 경우네는 널(null) 포인터를 반환한다.

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

int main()
{
   char   *str = "Hello World";

   printf( "%s\n", strstr( str, "World"));
  
   return 0;
}

 


9. 문자열에서 임의의 문자위치 검색하기 


형태  char *strchr(const char *str, int chr)

함수 strchr()는 str이 가리키는 문자열에서 ch의 하위 바이트가 처음으로 나타나는 곳의 위치 포인터를 반환한다. 만일 일치하는 것이 없을 경우에는 널(NULL) 포인터를 반환한다.

#include <stdio.h> #include <string.h> int main() { char *str = "Hello World"; printf( "%s\n", strchr( str, 'W')); return 0; }



10. 문자열 뒷부분부터 임의의 문자위치 검색하기

 

형태  char *strchr(const char *str, int chr)

함수 strchr()는 str이 가리키는 문자열의 뒷부분부터 ch의 하위 바이트가 처음으로 나타나는 곳의 위치 포인터를 반환한다. 만일 일치하는 것이 없을 경우에는 널(NULL) 포인터를 반환한다.

#include <stdio.h> #include <string.h> int main() { char *str = "Hello World"; printf( "%s\n", strrchr( str, 'o')); return 0; }



11. 문자열을 구분자로 나누기 


형태  char *strtok(char *str1, char *str2)

str1이 가리키는 문자열에서 다음 토큰에 대한 포인터를 반환한다. str2가 가리키는 문자열의 문자들은 토큰을 결정하기 위한 구분자들이다더 이상 반환할 토큰이 없을 때 널(null) 포인터가 반환된다함수 strtok()가 처음 호출될 때 str1은 실제 그 호출에서 사용된다그리고 그 다음의 호출에서는 첫 번째 인수로 널 (null) 포인터를 사용한다.이러한 방법으로 전체 문자열이 토큰으로 분리될 수 있다그리고 strtok()를 호출할 때마다 구분자의 집합을 매번 다르게 사용할 수 있다.

#include <stdio.h> #include <string.h> int main() { char str[] = "forum falinux com"; char *ptr; int ndx; printf( "함수 호출 전: %s\n", str); ptr = strtok( str, " "); printf( "%s\n", ptr); while( ptr = strtok( NULL, " ")) { printf( "%s\n", ptr); } printf( "함수 호출 후: %s\n", str); // 함수 호출 후에는 원본 문자열의 내용이 바뀌므로 주의해야 합니다. printf( "문자열의 변화\n", str); for( ndx=0; ndx < 17; ndx++) printf( "%c %d\n", str[ndx], str[ndx]); return 0; }


 

12. 문자열의 Clone 만들기 


형태  char *strdup(const char *str)

문자열 str을 복사하고 복사된 문자열을 가리키는 포인터를 반환한다. 문자를 복사할 공간을 확보하기 위해서 내부적으로 malloc()이 호출된다. 때문에 strdup()함수를 호출해서 문자열을 복사했다면 free()를 통해서 공간이 필요없게 되었을때 메모리를 해제시켜 주어야 한다.

#include <stdio.h> #include <string.h> int main() { char *ptr; ptr = strdup("Hello World"); printf( "%s\n", ptr); return 0; }


'프로그래밍 > C & C++' 카테고리의 다른 글

[C] 날짜/시간 처리 함수  (0) 2016.07.07
[C] 문자 처리 함수  (0) 2016.07.06
[C] 포인터  (0) 2016.03.31
[C] 구조체  (0) 2016.03.27
[C] 헤더파일  (0) 2016.01.12