day 11 homework 部分内容

This commit is contained in:
flykhan 2023-07-22 10:36:56 +08:00
parent e855ec7605
commit d2fe455589
2 changed files with 133 additions and 0 deletions

55
day11/homework/h4.c Normal file
View File

@ -0,0 +1,55 @@
// 编写一个程序要求用户输入一串字符然后动态创建一个字符数组并将用户输入的字符存储到数组中。然后使用realloc函数将数组的大小扩展为原来的两倍并继续接受用户输入的字符直到用户输入字符为换行符 '\n')。最后,打印数组中存储的所有字符。
#include <stdio.h>
#include <stdlib.h>
#include <string.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]; // 相当于 char *s1 = (char *)malloc(100 * sizeof(char *));
printf("请输入一个字符串: ");
// scanf("%s", s1);
fgets(s1, sizeof(s1), stdin); // scanf() 不能接收换行,故改用 fgets()
char *s2 = str_cpy(s2, s1);
int tmp_size = strlen(s2);
// 扩展数组大小
s2 = (char *)realloc(s2, 2 * tmp_size);
if (NULL == s2)
{
perror("realloc");
exit(0);
}
printf("请继续输入字符, 输入换行符结束输入\n");
char *ch;
s2[tmp_size - 1] = ' ';
while ((ch = getchar()) != '\n')
{
s2[tmp_size++] = ch;
}
printf("结果为: %s\n", s2);
free(s2);
return 0;
}

78
day11/homework/h8.c Normal file
View File

@ -0,0 +1,78 @@
// 设计函数 char (*tok(char *s, const char *delim))[100] 实现s按给定的分隔符分隔出所有的内容并返回分隔之后的二维数组指针。
// 示例:
// char s[] = "Hello,World,How,Are,You";
// const char delim[] = ",";
// char(*tokens)[100] = tok(s, delim);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char (*tok(char *s, const char *delim))[100]
{
// 计算分隔符的长度
size_t delim_len = strlen(delim);
// 计算字符串中分隔符的个数
int count = 1;
char *p = s;
while (*p != '\0')
{
if (strncmp(p, delim, delim_len) == 0)
{
count++;
p += delim_len; // 跳过分隔符
}
else
{
p++;
}
}
// 分配存储结果的二维数组
char(*tokens)[100] = malloc(count * sizeof(*tokens));
// 分隔字符串
int i = 0;
p = s;
char *token_start = p;
while (*p != '\0')
{
if (strncmp(p, delim, delim_len) == 0)
{
strncpy(tokens[i], token_start, p - token_start);
tokens[i][p - token_start] = '\0';
i++;
p += delim_len; // 跳过分隔符
token_start = p;
}
else
{
p++;
}
}
// 处理最后一个分隔符后的部分
strncpy(tokens[i], token_start, p - token_start);
tokens[i][p - token_start] = '\0';
return tokens;
}
int main()
{
char s[] = "Hello,World,How,Are,You";
const char delim[] = ",";
char(*tokens)[100] = tok(s, delim);
// 打印分隔后的结果
for (int i = 0; tokens[i][0] != '\0'; i++)
{
printf("%s\n", tokens[i]);
}
// 释放内存
free(tokens);
return 0;
}