목차
하나, strtok 함수
strtok 함수의 기능: 문자열을 토큰으로 분할
strtok 함수 사용:
int main()
{
char* p = "[email protected]";
const char* sep = ".@";
char arr[30];
char* str = NULL;
strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
{
printf("%s\n", str);
}
}
알아채다:
- sep 매개 변수는 구분 기호로 사용되는 문자 집합을 정의하는 문자열입니다.
- 첫 번째 매개변수는 sep 문자열에서 하나 이상의 구분 기호로 구분된 0개 이상의 토큰을 포함하는 문자열을 지정합니다.
- strtok 함수는 str에서 다음 토큰을 찾아 \0으로 종료하고 이 토큰에 대한 포인터를 반환합니다. (참고: strtok 함수는 조작되는 문자열을 변경하므로 strtok 함수를 사용하여 분할된 문자열은 일반적으로 임시 복사된 내용이며 수정할 수 있습니다.)
- strtok 함수의 첫 번째 매개변수는 NULL이 아니며, 함수는 str에서 첫 번째 표시를 찾고 strtok 함수는 문자열에 위치를 저장합니다.
- strtok 함수의 첫 번째 매개변수는 NULL이며 함수는 동일한 문자열의 저장된 위치에서 시작하고 다음 토큰을 검색합니다.
- 문자열에 더 이상 토큰이 없으면 NULL 포인터를 반환합니다.
둘, strerror 기능
strerror 함수의 기능: 오류 코드, 해당 오류 메시지 반환
strerror 함수를 사용하여 헤더 파일 가져오기
#include <erron.h>
strerror 함수 사용:
int main()
{
FILE* pf = fopen("date.txt", "r");
if (pf == NULL)
{
//printf("%s\n", strerror(errno));
perror("fopen")
return 1;
}
return 0;
}
보고된 오류는 프로그램 실행 중 실행 오류입니다.
셋, memcpy 기능
3.1 memcpy 함수의 이해
memcpy 함수의 기능: 소스 가 가리키는 위치 에서 목적지가 가리키는 메모리 블록으로 바이트 수의 값을 직접 복사
알아채다:
- 이 함수는 '\0'을 만나도 멈추지 않습니다.
- 어떤 방식으로든 소스와 대상이 겹치면 복사 결과가 정의되지 않습니다.
memcpy 함수를 사용하여 헤더 파일 가져오기
#include <문자열.h>
memcpy 함수 사용
int main()
{
int arr1[5] = { 0 };
int arr2[] = { 1,2,3 };
memcpy(arr1, arr2, 12);
int i = 0;
for (i = 0; i < 5; i++)
{
printf("%d ", arr1[i]);
}
}
정수와 부동 소수점을 복사할 수 있으므로 void*를 사용하여 수신
memcpy 함수는 겹치지 않는 메모리 복사본을 처리하는 데 사용됩니다.
3.2 memcpy 함수의 시뮬레이션 구현
#include <stdio.h>
#include <string.h>
#include <assert.h>
void* my_memcpy(void* dest, const void* src, int num)
{
assert(dest && src);
void* ret = dest;
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[5] = { 0 };
int arr2[] = { 1,2,3 };
my_memcpy(arr1, arr2, 12);
int i = 0;
for (i = 0; i < 5; i++)
{
printf("%d ", arr1[i]);
}
}
참고: 캐스트는 일시적입니다.
네, memmove 기능
4.1 memmove 기능의 이해
memmove 함수의 기능: 소스가 가리키는 위치에서 대상이 가리키는 메모리 블록으로 바이트 수의 값을 복사합니다. 목적지와 소스는 겹칠 수 있습니다.
알아채다:
오버플로를 방지하려면 대상 및 소스 매개변수가 가리키는 배열의 크기가 최소한 바이트 수여야 합니다.
원본 공간과 대상 공간이 겹치는 경우 memmove 함수를 사용하여 처리해야 합니다.
memmove 함수를 사용하여 헤더 파일 가져오기
#include <문자열.h>
memmove 기능 사용
int main()
{
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
memmove(arr + 2, arr, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
4.2 memmove 함수의 시뮬레이션 구현
이 복사는 우리가 원하는 결과와 다르기 때문에 뒤에서 앞으로 복사합니다.
src가 dest 앞에 있을 때: after --> before
src가 dest 뒤에 있을 때: 이전 --> 이후
#include <stdio.h>
#include <string.h>
#include <assert.h>
void* my_memmove(void* dest, const void* src, int num)
{
assert(dest && src);
char* ret = dest;
if (dest < src)
{
//前->后
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
//后->前
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
int main()
{
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
my_memmove(arr + 2, arr, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
다섯, memcmp 기능
5.1 memcmp 함수의 이해
memcmp 함수의 기능: ptr1 및 ptr2 포인터에서 시작하는 num 바이트 비교
memcmp 함수를 사용하여 헤더 파일 가져오기
#include <문자열.h>
memcmp 함수 사용:
int main()
{
int arr1[] = { 1,2,1,5,4 };
int arr2[] = { 1,2,257 };
int ret = memcmp(arr1, arr2, 9);
printf("%d\n", ret);
return 0;
}
두 배열의 처음 9바이트는 동일하므로 0을 반환합니다.
5.2 memcmp 함수의 시뮬레이션 구현
#include <stdio.h>
#include <string.h>
#include <assert.h>
int my_memcmp(const void* s1, const void* s2, int num)
{
assert(s1 && s2);
char* str1 = (char*)s1;
char* str2 = (char*)s2;
int i = 0;
for (i = 0; i < num; i++)
{
if (*(str1 + i) != *(str2 + i))
{
return (*(str1 + i) - *(str2 + i));
}
}
return 0;
}
int main()
{
int arr1[] = { 1,2,3,5,4 };
int arr2[] = { 1,2,257 };
int ret = my_memcmp(arr1, arr2, 9);
printf("%d\n", ret);
return 0;
}
여섯, memset 기능
memset 함수의 기능: ptr이 가리키는 첫 번째 num 바이트를 value 값으로 설정합니다.
memcset 함수를 사용하여 헤더 파일 가져오기
#include <문자열.h>
memset 기능 사용:
int main()
{
char arr[] = "hello word";
memset(arr, 'x', 5);
printf("%s\n", arr);
return 0;
}
알아채다:
- 설정할 값입니다. 값은 int로 전달되지만 함수는 이 값의 부호 없는 문자 변환으로 메모리 블록을 채웁니다.
- 바이트 단위로 설정
배열의 각 요소를 1로 변경하는 것은 불가능합니다.
일곱, 문자 분류 기능
캐릭터 판단 기능을 사용하여 파일을 리드
#include <ctype.h>
참이면 0이 아닌 숫자를 반환하고, 거짓이면 0을 반환한다.
기능 | 인수가 다음 조건을 충족하면 true를 반환합니다. |
iscntrl | 모든 제어 문자 |
isspace | 공백 문자: 공백 ' ', 양식 공급 '\f', 줄 바꿈 '\n', 캐리지 리턴 '\r', 탭 '\t' 또는 세로 탭 '\v' |
심지어 | 10진수 0~9 |
자릿수 | 모든 10진수를 포함한 16진수, 소문자 a~f, 대문자 A~F |
더 낮은 | 소문자 a~z |
isupper | 대문자 A~Z |
이살파 | 문자 a~z 또는 A~Z |
아이스 홀 | 문자 또는 숫자, a~z,A~Z,0~9 |
ispunct | 문장 부호, 숫자나 문자가 아닌 모든 그래픽 문자 |
isgraph | 모든 그래픽 문자 |
스프린트 | 그래픽 문자 및 공백 문자를 포함하여 인쇄 가능한 모든 문자 |
여덟, 문자 변환 기능
int tolower ( int c ); 대문자 ---> 소문자
int toupper ( int c ); 소문자 ---> 대문자
int main()
{
char str[20] = { 0 };
gets(str);
char* p = str;
while (*p)
{
if (isupper(*p))
*p = tolower(*p);
p++;
}
printf("%s\n", str);
return 0;
}
이번 시간의 내용은 여기까지입니다. 읽으신 후 조금이나마 도움이 되셨기를 바라며, 독자 여러분의 성원에 감사드립니다. 기사에 대해 궁금한 점이 있으면 댓글 영역에 메시지를 남길 수 있으며 블로거는 신중하게 수정하여 향후 더 나은 기사를 작성해야합니다.