문자 기능 및 메모리 기능 (2)

목차

하나, strtok 함수

둘, strerror 기능

셋, memcpy 기능

3.1 memcpy 함수의 이해

3.2 memcpy 함수의 시뮬레이션 구현

네, memmove 기능

4.1 memmove 기능의 이해

4.2 memmove 함수의 시뮬레이션 구현

다섯, memcmp 기능

5.1 memcmp 함수의 이해

 5.2 memcmp 함수의 시뮬레이션 구현

 여섯, memset 기능

 일곱, 문자 분류 기능

여덟, 문자 변환 기능


하나, 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;
}

이번 시간의 내용은 여기까지입니다. 읽으신 후 조금이나마 도움이 되셨기를 바라며, 독자 여러분의 성원에 감사드립니다. 기사에 대해 궁금한 점이 있으면 댓글 영역에 메시지를 남길 수 있으며 블로거는 신중하게 수정하여 향후 더 나은 기사를 작성해야합니다. 

추천

출처blog.csdn.net/2301_76207836/article/details/131687816