78 lines
1.7 KiB
C
78 lines
1.7 KiB
C
// 设计函数 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;
|
||
} |