memcpy

memcpy是内存拷贝,拷贝字符串、拷贝整型数组、拷贝结构体数据
函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。这个函数在遇到’\0’的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的。

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[20] = { 0 };
	//将arr1中的内容,拷贝到arr2中
	memcpy(arr2, arr1, 40);
	int i = 0;
	for (i = 0; i < 20; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

memmove

和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。如果源空间和目标空间出现重叠,就得使用memmove函数处理

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(arr1+2, arr1, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

memcmp

比较从ptr1和ptr2指针开始的num个字节

int main()
{
	int arr1[] = { 1,2,1,4,5,6 };
	int arr2[] = { 1,2,257 };
	int ret = memcmp(arr1, arr2, 10);
	printf("%d\n", ret);
	return 0;
}

memset

内存设置函数,以字节为单位进行设置

int main()
{
	char arr[] = "hello bit";
	memset(arr + 1, 'x', 4);//以字节位单位设置的
	printf("%s\n", arr);
	return 0;
}

memset

内存设置函数,以字节为单位进行设置

int main()
{
	char arr[] = "hello bit";
	memset(arr + 1, 'x', 4);//以字节位单位设置的
	printf("%s\n", arr);
	return 0;
}

杨氏矩阵

有一个数字矩阵,矩阵的每行从左到右都是递增的,矩阵从上到下都是递增的,请编写程序在这样的矩阵中查到某个数字是否存在

int main()
{
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	int k = 0;
	scanf("%d", &k);
	int x = 0;
	int y = 2;
	int flag = 0;
	while (x <= 2 && y >= 0)
	{
		if (arr[x][y] < k)
		{
			x++;
		}
		else if (arr[x][y] > k)
		{
			y--;
		}
		else
		{
			printf("找到了,下标是:%d %d\n", x, y);
			flag = 1;
			break;
		}
	}
	if (flag == 0)
		printf("找不到\n");
	return 0;
}
void young_tableau_search(int arr[3][3], int k, int *px, int *py)
{
	int x = 0;
	int y = *py-1;
	int flag = 0;
	while (x <= *px - 1 && y >= 0)
	{
		if (arr[x][y] < k)
		{
			x++;
		}
		else if (arr[x][y] > k)
		{
			y--;
		}
		else
		{
			*px = x;
			*py = y;
			return;
		}
	}
	*px = -1;
	*py = -1;
}

int main()
{
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	int k = 0;
	scanf("%d", &k);
	int x = 3;
	int y = 3;
	young_tableau_search(arr, k, &x, &y);
	if (x == -1 && y == -1)
		printf("找不到\n");
	else
		printf("找到了,下标是:%d %d\n", x, y);
	return 0;
}

字符串左旋

实现一个函数,可以左旋字符串中的k个字符

void left_move(char* str, int k)
{
	int j = 0;
	assert(str);
	for (j = 0; j < k; j++)
	{
		char tmp = *str;
		int len = strlen(str);
		int i = 0;
		for (i = 0; i < len - 1; i++)
		{
			*(str + i) = *(str + i + 1);
		}
		*(str + len - 1) = tmp;
	}
}


int main()
{
	char arr[] = "abcdef";
	int k = 0;
	scanf("%d", &k);

	left_move(arr, k);
	printf("%s\n", arr);
	return 0;
}
void reverse(char* left, char* right)
{
	assert(left && right);
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}

void left_move(char* str, int k)
{
	int len = strlen(str);
	k %= len;
	//左边逆序
	reverse(str, str+k- 1);
	//右边逆序
	reverse(str+k, str + len - 1);
	//整体逆序
	reverse(str, str + len - 1);
}

int main()
{
	char arr[] = "abcdef";
	int k = 0;
	scanf("%d", &k);

	left_move(arr, k);
	printf("%s\n", arr);
	return 0;
}

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串

int is_left_move(char* str1,char*str2)
{
	int j = 0;
	int len = strlen(str1);
	for (j = 0; j < len; j++)
	{
		char tmp = *str1;
		//int len = strlen(str1);
		int i = 0;
		for (i = 0; i < len - 1; i++)
		{
			*(str1 + i) = *(str1 + i + 1);
		}
		*(str1 + len - 1) = tmp;
		if (strcmp(str1, str2) == 0)
			return 1;
	}
	return 0;
}

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "cdefab";
	int ret = is_left_move(arr1, arr2);
	if (ret == 1)
		printf("Yes\n");
	else
		printf("No\n");
	return 0;
}
int is_left_move(char* str1, char* str2)
{
	int len1 = strlen(str1);
	int len2 = strlen(str2);
	if (len1 != len2)
		return 0;

	strncat(str1, str1, len1);
	if (strstr(str1, str2) == NULL)
		return 0;
	else
		return 1;
}

int main()
{
	char arr1[20] = "abcdef";
	//abcdefabcdef
	char arr2[] = "cdefab";
	int ret = is_left_move(arr1, arr2);
	if (ret == 1)
		printf("Yes\n");
	else
		printf("No\n");
	return 0;
}
Logo

一站式 AI 云服务平台

更多推荐