노는게 제일 좋습니다.
16회차 : 문자열 함수, 수치와 문자열 본문
오늘은 글을 쓰면서 마크다운을 배워야겠다는 생각이 강렬히 들었다.
그리고 주변 지인들에겐 옛날자료 보지말고 최신책 사서 보라고 말해줘야겠다
모두 string.h 에 포함된 함수들.
0. 참고 자료
내용 전체 http://soen.kr/
strcpy_s http://ehclub.co.kr/790
strncpy_s http://ehclub.co.kr/792
1. 문자열 길이 조사
- size_t strlen(const char *string);
2 문자열 복사
- strcpy_s(char *dest, size_t length, const char *src);
dest : src를 복사할 문자열 포인터, length : 버퍼 길이, src : 복사될 문자열 포인터
src의 내용을 dest에 복사해 넣는다.
*기존 strcpy(char *dest, char *src)함수에서는 src길이>(dest길이-1) 이면 오버플로 버그가 났었다고 한다. 이를 해결한게 strcpy_s라고.
- errno_t strncpy_s ( char * destination,size_t size, const char * source, size_t n );
destination : source를 복사할 문자열 포인터, size:버퍼길이, source:복사될 문자열 포인터, n:복사할 길이
* source지점에서부터 n개의 문자를 destination위치에 복사한다.
* 복사하고 나서 뒤에 널문자를 붙인다.
3. 문자열 연결
- char *strcat_s(char *dest, size_t size, const char *src);
dest의 널문자를 지우고, src문자열을 dest문자열 뒤에 붙인다.
이 때, dest의 문자배열 크기는 dest와 src의 길이를 합친 것보다 같거나 커야한다. 작으면 프로그램 뻗음.
- char *strncat_s(char *dest, size_t size, const char *src,size_t count);
strcat_s와 같으나, src문자열에서 count만큼의 갯수만 연결해준다.
4. 문자열 비교
- int strcmp(const char *s1, const char *s2);
- int strncmp(const char *s1, const char *s2, size_t count);
- int stricmp(const char *string1, const char *string2);
- int strnicmp(const char *string1, const char *string2, size_t count);
이런것도 있는데. i가 함수이름 중간에 들어가면 대소문자를 무시한다. ab나 AB나 똑같은거다.
- char *strchr(const char *string, int c);
string문자열 안에서 c에 해당하는 문자중 가장 앞쪽것의 번지를 리턴한다. 없으면 NULL리턴.
printf("%d %d\n", "abAB", strchr(d, 'A')); 하면 두 값이 2차이날것. 'A'부분을 65로 바꿔도 됨.
- char *strrchr(const char *string, int c);
strchr랑 하는짓은 똑같은데 뒤에서부터 검색한다.
- char *strstr(const char *string, const char *strSearch);
string문자열 안에서 strSearch문자열을 찾아 시작번지 리턴
- char *strpbrk(const char *string, const char *strCharSet );
strCharSet문자열에 들어있는 문자 하나하나를 모조리 string내에서 검색한다. 가장 빨리 찾은놈의 번지를 리턴.
printf("%d %d\n", "umapplepen", strpbrk("umapplepen", "abcd"));
이러면 두 번지값의 차이가 2 난다. umapplepen에서 a를 가장 먼저 찾았기 때문.
- char *strtok(char *strToken, const char *strDelimit);
strDelimit에는 구분자를 준다. ", "와 같이 주면 쉼표(,)와 공백( )을 구분자로 사용한다.
strToken에서 이 문자들을 만나면 그 위치에 NULL값을 쓴 뒤, 앞에있는 문자열의 포인터를 리턴한다.
첫 번째 인수가 NULL이면 NULL문자를 만날 때 까지 윗줄의 동작을 반복한다.
int main()
{
char s[20] = "a b c d,e f";
char *p=strtok(s,", ");
while (p != NULL)
{
printf("%d %s \n", p, p);
p = strtok(NULL, ", ");
}
return 0;
}
6. 문자열 변환
- char *strset(char *string, int c);
- char *strnset(char *string, int c, size_t count);
string문자열을 c문자로 채운다. strnset은 갯수지정가능.
- char *strlwr(char *string);
모두 소문자로
- char *strupr(char *string);
모두 대문자로
- char *strrev(char *string);
문자열 순서 뒤집기. apple->elppa
7. 문자가 특정 그룹에 속하는지 확인, 대소문자 변환
http://soen.kr/lecture/ccpp/cpp1/12-1-6.htm
함수를 호출해 그룹에 속하면 0아닌값, 안속하면 0을 리턴.
tolower(char)는 소문자로, toupper(char)는 대문자로.
8. 메모리 관리 함수
- void *memcpy(void *dest, const void *src, size_t count);
- void *memmove(void *dest,const void *src,size_t count);
현재 vs에서는 둘은 같은 함수.
- int memcmp(const void *buf1,const void *buf2,size_t count);
같나 안같다 보는함수
- void *memchr(const void *buf,int c,size_t count);
찾기
- void *memset(void *dest,int c,size_t count);
dest를 싸그리 c로 count개만큼 값을 바꿈.
char *itoa(int value, char *string, int radix);
char *ltoa(long value, char *string, int radix);
char *ultoa(unsigned long value, char *string, int radix);
정수를 문자로 바꿈. value는 숫자. string은 문자로 바뀐게 저장될 문자배열. radix는 진법
char *gcvt(double value, int digits, char *buffer);
char *ecvt(double value, int count, int *dec, int *sign);
char *fcvt(double value, int count, int *dec, int *sign);
실수를 문자로 바꿈
10. 문자(열)--->숫자 변환함수
int atoi(const char *string);
long atol(const char *string);
long strtol(const char *nptr, char **endptr, int base);
unsigned long strtoul(const char *nptr, char **endptr, int base);
문자(열)을 숫자로 바꿔 리턴. atoi, atol은 10진법으로만 인식하지만, strtol,strtoul은 진법바꾸기 가능.
base가 진법.
double atof(const char *string);
double strtod(const char *nptr, char **endptr);
문자(열)을 실수로 바꿔 리턴
'C' 카테고리의 다른 글
18회차(끝) : 구조체 초기화, 비트 구조체, 공용체 (0) | 2017.03.03 |
---|---|
17회차 : 구조체 정의, 구조체 멤버 참조 (0) | 2017.03.02 |
15회차 : 배열 포인터, 배열과 문자열 (0) | 2017.02.26 |
14회차 : 첨자 연산, 포인터 배열 (0) | 2017.02.23 |
13회차 : 동적 메모리 할당, 이중 포인터 (0) | 2017.02.20 |