지난시간 내용 복습
문자열은 char[ ]라는 배열이라고 했다.(“Hello")물론, 유니코드로 표현하면wchar_t[ ]가 된다.(L"Hello") 배열이지만, 이름이 없는 것이 문자열의 중요한 내용 이였다.
이 점을 잘 이해했다고 가정하고 들어간다. 지난시간은 문자 처리함수도 추가로 배웠는데, isalpha(), isdigit()...와 toupper()같은 문자를 검사하거나 소문자를 대문자로 바꾸는 함수들을 배웠었다. 이번 강의에는 문자가 아닌 문자열의 처리 함수에 대해 배운다. 이 모든 것을 이해하고 강의를 들어가자.
문자열 처리함수
sprintf()함수는 매우 심각한 보안 결함을 가지고 있다. 그럼에도 함수를 알아보자면, 어느 메모리에다가 정보를 메모하는 함수다. 매개변수는 printf의 매개변수 + 앞에 저장될 메모리의 주소(배열)가 들어간다. 심각한 보안문제 때문에, 대체함수로 _snprintf()함수를 사용한다. 윈도우에서는 sprintf_s를 대체함수로 사용해도 된다.
여기서는 메모리의 주소 뒤에, 크기를 추가해 주어야 되는데, sizeof(크기) 형식으로 말이다. sizeof(메모리 주소)와 같이 해주면 sprintf()와 동일하게 쓸 수 있다. (사실 메모리 쓰기를 연산하는 함수 중, 크기 값이 없는 함수는 99% 보안결함이 있다)
strlen()함수는 문자열의 길이를 계산해주는 함수다. 주소를 매개변수로 하면, 문자열의 개수를 반환한다.(영상에서 size_t라는 자료형이 나오는데, unsigned int형이다)
주의할 점은 널 문자()를 매개변수로 넣어주면 죽는 것이다.
strcmp()함수는 두 문자열을 비교하는 함수다. 같으면 0을 반환하고, 다르면 알파벳순에 따라서 첫 번째 문자열이 빠르면 음수, 나중이면 양수를 반환한다.(memcmp와 똑같은데, 차이점은 str개열 함수는 널문자(Null)를 만나면 중간에 끝나는 점이다)
strncmp()함수는 두 문자열의 일정 부분을 비교하는 함수다. strcmp()의 매개변수 뒤에 추가로 비교할 문자열의 개수가 붙는다. 반환 값은 strcmp()과 같다.
strcpy()는 심각한 보안 결함을 가진 또 하나의 함수다. 대체함수로는 strcpy_s()와 strncpy()가 있다.(가운데에 복사하는 크기 값(ex, 6)을 매개변수로 넣어주어야 된다) 메모리를 복사해서 붙여 넣는 함수이다.(오른쪽에서 왼쪽 매개변수로) 단순대입(=)과 같은데, 단순대입은 요소가 1개만 가능한 것이 다르다. (그러나 포인터가 왼쪽에 단순대입 한다면, 값이 문자열의 주소가 되기 때문에 덮어쓰기가 성립된다)
strcat()도 심각한 보안 결함을 가진 함수다. 대체함수로 strcat_s나 strncat가 있다. 이 함수는 문자열을 서로 붙여주는데, (주소1, 주소2)가 있다면 주소1의 뒤에다 주소2를 바로 붙여준다. (문자열의 주소가 들어간다면, 이름이 없기 때문에 문자열 자체가 들어간다.(ex, "World") )Append가 일어난다고 하는데, 메모리가 넘어서는 경우에는 over가 일어나므로, 매우 심각한 문제가 생긴다. (심각한 것들이 너무 많다. 항상 조심하자)그래서 메모리가 오버되지않도록 주의하자.
strstr()함수는 문자열에서 특정 문자열을 검색하는 함수다. 매개변수로(검색대상의 문자열이 있는 메모리주소, 검색할 문자열이 있는 메모리주소)가 들어가는데, 문자열을 찾았다면 그 문자열의 메모리 주소가 반환 값이, 아니면 NULL가 반환 값이 된다. 재밌는 것은 그렇게 strstr()로 검색해서 찾은 주소 값을 기준의 주소 값으로 빼주면 인덱스의 값이 나온다. (ex, "I am tired"에서 ‘a의 주소 값‘ - ‘I의 주소 값‘ = 2(a의 인덱스 값과 같다)
strchr()함수는 문자열에서 특정 문자를 검색하는 함수다. 매개변수는(검색대상의 문자열 메모리주소, 검색할 문자)가 들어간다. 반환 값은 strstr()과 같다.
strpbrk()함수는 strstr()함수처럼 문자열에서 문자열을 검색하는 함수인데, 약간의 차이가 있다. 검색하는 문자열이 abc일 경우에, strstr()함수는 abc를 찾는데, strpbrk()함수는 a나 b나, c를 찾는다.
strtok()함수는 또 심각한 보안결함을 가지고 있다. 문자열을 토큰화 하는데, 쉽게 말해서 하나하나 자른다. 매개변수는 이렇다.(자를 문자열, 자르는 기준이 될 문자들(문자열))로 된다. (ex, aBuffer=“2+1=4"; aSep="+-="; strtok(aBuffer, aSep);라면 aBuffer의 값이 2,1,4로 쪼개진다.)
wcstombs()함수는 유니코드 문자열을 MBCS(멀티바이트) 문자열로 변환하는 함수다. (변환 후 저장 메모리주소, 변환할 유니코드 메모리주소, 변환 문자열 최대크기)가 매개변수다. 변환된 문자열의 길이를(만약 저장될 메모리 주소의 값이 NULL이면 변환에 필요한 메모리길이를) 반환한다.
mbstowcs()함수는 wcstombs()와 반대다. MBCS를 유니코드 문자열로 변환한다. 근데 또 보안결함이 있다. wcstombs()와 세트로 알아두자.
swprintf()/wprintf()함수는 문자열에 L이 붙으면, 그러니까 문자열이 유니코드 형식이면, sprintf()랑 printf()가 swprintf()와 wprintf()로 바꿔서 쓰인다. wchar_t는 2byte, 2덩어리가 모여서 하나가 되는 것, 다시 알아두자.
'c언어 > 워딩(미정리)' 카테고리의 다른 글
지역 ,자동, 전역, 정적, 레지스터 변수 (0) | 2019.07.08 |
---|---|
유틸리티 함수 (0) | 2019.07.08 |
문자열의 구분 및 문자 처리 함수 (0) | 2019.07.08 |
매개변수 전달방식 (0) | 2019.07.08 |
함수 설계 원칙 (0) | 2019.07.08 |