C语言进阶第9课-memcpy、memmove、memcmp、memset
memcpy是内存拷贝,拷贝字符串、拷贝整型数组、拷贝结构体数据函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。这个函数在遇到’\0’的时候并不会停下来。如果source和destination有任何的重叠,复制的结果都是未定义的。
·
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;
}
更多推荐




所有评论(0)