day10 homework: 动态内存申请,内存泄漏,字符串处理函数

This commit is contained in:
flykhan 2023-07-17 23:48:18 +08:00
parent d276faf99b
commit 4e670ac3a6
7 changed files with 276 additions and 0 deletions

35
day11/homework/h1.c Normal file
View File

@ -0,0 +1,35 @@
// 编写一个程序要求用户输入一个整数n然后动态创建一个大小为n的整数数组并通过循环将数组的元素赋值为1到n的连续整数。最后打印数组的内容。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int *create_arr(int n)
{
int *p = (int *)malloc(n * sizeof(int *));
if (NULL == p)
{
perror("malloc");
exit(0);
}
memset(p, 0, n * sizeof(int *)); // 设定初始值为 0
int i = 0;
for (; i < n; i++)
*(p + i) = i + 1;
return p;
}
int main()
{
int n;
printf("请输入一个整数: ");
scanf("%d", &n);
int *nums = create_arr(n);
while (*nums)
printf("%d ", *(nums++));
printf("\n");
free(nums);
return 0;
}

35
day11/homework/h2.c Normal file
View File

@ -0,0 +1,35 @@
// 编写一个程序,要求用户输入一个字符串,然后动态创建一个字符数组,使其能够容纳用户输入的字符串。然后将用户输入的字符串复制到动态创建的数组中,并打印该字符串。
#include <stdio.h>
#include <stdlib.h>
char *str_cpy(char *dest, const char *src)
{
int cnt;
while (src[cnt++])
;
char *res = (char *)malloc(cnt * sizeof(char *));
if (NULL == res)
{
perror("malloc");
exit(0);
}
for (int i = 0; i < cnt; i++)
res[i] = src[i];
return res;
}
int main()
{
char s1[100];
printf("请输入一个字符串: ");
// scanf("%s", s1);
fgets(s1, sizeof(s1), stdin); // scanf() 不能接收换行,故改用 fgets()
char *s2 = str_cpy(s2, s1);
printf("s2 被复制后的结果为: %s", s2);
free(s2);
return 0;
}

58
day11/homework/h3.c Normal file
View File

@ -0,0 +1,58 @@
// 编写一个程序要求用户输入两个整数m和n然后动态创建一个m行n列的二维整数数组。通过循环将数组的元素赋值为m行n列的连续整数。最后打印数组的内容。
#include <stdio.h>
#include <stdlib.h>
int **create_nums_arr(int m, int n)
{
// 创建二维数组
int **nums_arr = (int **)malloc(m * sizeof(int *)); // 先给二维数组分配内存,每一行的内存在下面分配
if (NULL == nums_arr)
{
perror("malloc");
exit(-1);
}
for (int i = 0; i < m; i++)
{
nums_arr[i] = (int *)malloc(n * sizeof(int *)); // 给每一行分配内存
if (NULL == nums_arr[i])
{
perror("malloc");
exit(-1);
}
}
int i = 0;
for (int j = 0; j < m; j++)
{
for (int k = 0; k < n; k++)
nums_arr[j][k] = i++; // 从 0 开始赋值
}
return nums_arr; // 返回二维数组
}
int main()
{
int m, n;
printf("请输入两个整数 m 和 n: ");
scanf("%d%d", &m, &n);
int **nums = create_nums_arr(m, n); // 创建二维数组
printf("二维数组的内容为: \n");
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
printf("%d ", nums[i][j]);
printf("\n");
}
// 释放内存
for (int i = 0; i < m; i++)
{
free(nums[i]); // 释放每一行的内存
}
free(nums); // 再释放二维数组的内存
return 0;
}

35
day11/homework/h5.c Normal file
View File

@ -0,0 +1,35 @@
// 编写一个程序要求用户输入一个整数n然后动态创建一个整数数组并通过循环从用户输入中读取n个整数并存储到数组中。然后使用realloc函数将数组的大小减半并打印减半后的数组内容。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
printf("请输入一个整数: ");
scanf("%d", &n);
int *nums = (int *)malloc(n * sizeof(int *));
if (NULL == nums)
{
perror("malloc");
exit(-1);
}
printf("请输入 %d 个整数: ", n);
for (int i = 0, temp = 0; i < n; i++)
{
scanf("%d", &temp);
nums[i] = temp;
}
int halfN = n / 2; // n 的一半
nums = (int *)realloc(nums, halfN * sizeof(int *));
printf("减半后的数组内容打印如下: \n");
while (halfN--)
printf("%d ", *nums++);
printf("\n");
free(nums);
return 0;
}

33
day11/homework/h6.c Normal file
View File

@ -0,0 +1,33 @@
// 编写一个程序要求用户输入一个字符串然后使用strrev函数将字符串反转并打印反转后的字符串。
#include <stdio.h>
#include <stdlib.h>
char *strrev(char *src)
{
int cnt = 0;
while (src[cnt++])
;
char *res = (char *)malloc(cnt * sizeof(char *));
int tmp = cnt;
for (int i = 0; i < cnt; i++)
{
res[i] = src[tmp - 2]; // tmp - 2 是为了去掉换行符, tmp - 1 是为了去掉字符串末尾的 \0
tmp--;
}
return res;
}
int main()
{
char s1[100];
printf("请输入一个字符串: ");
fgets(s1, sizeof(s1), stdin); // scanf() 不能接收换行,故改用 fgets()
char *s2 = strrev(s1);
printf("反转后的字符串结果为: %s", s2);
free(s2);
return 0;
}

17
day11/homework/h7.c Normal file
View File

@ -0,0 +1,17 @@
// 编写一个程序要求用户输入一个字符串然后使用strncpy函数将字符串的一部分复制到另一个字符数组中但限制复制的长度为原字符串的一半并打印复制后的字符串。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char s1[100];
printf("请输入一个字符串: ");
fgets(s1, sizeof(s1), stdin); // scanf() 不能接收换行,故改用 fgets()
char *s2 = (char *)malloc(strlen(s1) / 2 * sizeof(char *));
strncpy(s2, s1, strlen(s1) / 2);
printf("复制后的字符串结果为: %s", s2);
return 0;
}

63
day11/homework/h9.c Normal file
View File

@ -0,0 +1,63 @@
/*
strtok函数对其解析
char msg_src[] = {"+CMGR:REC UNREAD,+8613466630259,98/10/01,18:22:11+00,ABCdefGHI"};
98 / 10 / 01
18 : 22 : 11
13466630259
ABCdefGHI
int msg_deal(char *msg_src, char *msg_done[], char *str)
1
2
3
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int msg_deal(char *msg_src, char *msg_done[], char *str)
{
int cnt = 0;
char *tmp = strtok(msg_src, str);
while (tmp != NULL)
{
if (cnt == 1) // 如果是发件人,去掉前面的 +86
{
if (strncmp(tmp, "+86", 3) == 0) // 如果前三位是 +86
tmp += 3; // +86 的长度为 3, tmp 指针向后移动 3 位
}
if (cnt == 3) // 处理时间字符串
{
int len = strlen(tmp); // 获取字符串长度
if (len >= 3 && strcmp(tmp + len - 3, "+00") == 0) // 如果末尾是 +00 且字符串长度大于等于 3
tmp[len - 3] = '\0'; // 去掉末尾的 +00即将 +00 替换为 \0
}
msg_done[cnt++] = tmp; // 将切割后的字符串存入指针数组
tmp = strtok(NULL, str); // 继续切割
}
return cnt; // 返回切割的字符串总数量
}
int main()
{
char msg_src[] = {"+CMGR:REC UNREAD,+8613466630259,98/10/01,18:22:11+00,ABCdefGHI"};
char *msg_done[5]; // 5 个字符串
char str[] = ","; // 以逗号为切割字符
int cnt = msg_deal(msg_src, msg_done, str);
printf("日期:%s\n", msg_done[2]);
printf("时间:%s\n", msg_done[3]);
printf("发件人:%s\n", msg_done[1]);
printf("内容:%s\n", msg_done[4]);
return 0;
}