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;
|
|||
|
}
|