출처: 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 |