노는게 제일 좋습니다.

16회차 : 문자열 함수, 수치와 문자열 본문

C

16회차 : 문자열 함수, 수치와 문자열

노는게 제일 좋습니다. 2017. 3. 1. 04:45

오늘은 글을 쓰면서 마크다운을 배워야겠다는 생각이 강렬히 들었다.

그리고 주변 지인들에겐 옛날자료 보지말고 최신책 사서 보라고 말해줘야겠다

모두 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);

널문자는 길이에 포함되지 않음. 길이의 단위는 바이트.
( 예 : printf("%s",strlen("studio플러그")); // studio는 6바이트, 플러그는 6바이트, 총 12바이트. 12출력. )


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);

내용이 같으면 0리턴.
내용이 다른경우 s1값이 크면 양수, s2가 크면 음수 리턴 

- int stricmp(const char *string1, const char *string2);

- int strnicmp(const char *string1, const char *string2, size_t count);

이런것도 있는데. i가 함수이름 중간에 들어가면 대소문자를 무시한다. ab나 AB나 똑같은거다.



5. 문자열 검색

- 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개만큼 값을 바꿈.


9. 숫자--->문자(열) 변환 함수

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);

문자(열)을 실수로 바꿔 리턴



11.sprintf()
- int sprintf(char *buffer,const char *format , ...);
printf와 같지만, 고거를 그냥 출력을 안하고 버퍼포인터로 보낸다. 왜지..


Comments