按某一字符串分割字符串 谢谢了
本帖最后由 随风浩荡几万里 于 2020-6-2 21:26 编辑字符串"ip route add 192.168.3.10 0x69 ip route add 192.168.3.20 0x69 ip route add 192.168.3.10" 以“0x69”为分隔符 分割为
ip route add 192.168.3.10
ip route add 192.168.3.20
ip route add 192.168.3.10
C语言实现 先用 for 循环找到 每一个 分隔符的位置
然后 .substr()(得加 #include<cstring> 头文件) liuzhengyuan 发表于 2020-6-2 21:20
先用 for 循环找到 每一个 分隔符的位置
然后 .substr()(得加 #include 头文件)
额 抱歉 我没说清楚 得需要用C语言实现 您说的是C++的吧 随风浩荡几万里 发表于 2020-6-2 21:25
额 抱歉 我没说清楚 得需要用C语言实现 您说的是C++的吧
那你可以试试用一个 二位字符数组来存放分割好的字符数组
.substr 就用 for 循环来代替 本帖最后由 赚小钱 于 2020-6-2 22:27 编辑
写的比较丑。
int subcount(const char *haystack, const char *needle) {
int count = 0;
int needle_length = strlen(needle);
const char *tmp = haystack;
while (tmp = strstr(tmp, needle)) {
count++;
tmp += needle_length;
}
return count;
}
char **split(const char *haystack, const char *needle) {
int count = subcount(haystack, needle);
if (0 == count) {
return 0;
}
int index = 0;
int needle_length = strlen(needle);
char **results = (char **) malloc(sizeof(char *) * (count + 1 + 1));
memset(results, 0, sizeof(char *) * (count + 1 + 1));
const char *start = haystack, *end = 0;
while ((end = strstr(start, needle)) != 0) {
results = (char *) malloc(sizeof(char) * (end - start + 1));
memcpy(results, start, (end - start) * sizeof(char));
results = '\0';
index += 1;
start = end + needle_length;
}
results = strdup(start);
return results;
}
int main() {
char *haystack = "ip route add 192.168.3.10 0x69 ip route add 192.168.3.20 0x69 ip route add 192.168.3.10";
char *needle = "0x69";
char **results = split(haystack, needle);
if (results == 0) {
printf("needle not found\n");
return 0;
}
char **tmp = results;
for (; tmp != 0; tmp++) {
printf("%s\n", *tmp);
}
tmp = results;
for (; tmp != 0; tmp++) {
free(*tmp);
}
free(results);
return 0;
}
output
ip route add 192.168.3.10
ip route add 192.168.3.20
ip route add 192.168.3.10 本帖最后由 Darth_EF 于 2020-6-3 02:21 编辑
#include <stdio.h>
#include <stdlib.h>
const int arrMax = 1024;
typedef struct ChatXX_length{
char** paths;
int length;
}ChatXX_length;
void printChatXX(ChatXX_length data){
int i = 0;
char c;
for(;i<data.length;++i){
printf("%s\n", data.paths);
}
}
ChatXX_length split(const char *data, const char *_flag);
int main()
{
char d[]="ip route add 192.168.3.10 0x69 ip route add 192.168.3.20 0x69 ip route add 192.168.3.10",
f[]="0x69";
ChatXX_length c=split(d, f);
printChatXX(c);
return 0;
}
ChatXX_length split(const char *data, const char *_flag)
{
ChatXX_length returnValue;
char** paths;
int i = 0, j = 0, k = 1, l=0, flagIndex,flagLenght;
//匹配数据
for (i = 0; data != 0; ++i, j = 0){
if (data == _flag){
for (j = 1; _flag != 0; ++j){
if(_flag != data){//未能匹配到
break;
}
}
if (_flag == 0){//匹配成功
flagIndex=i;
i+=j;
++k;
flagLenght=j;
}
}
}
flagIndex=i;
//分配空间
paths = malloc(sizeof(char*)*k);
paths = malloc(sizeof(char) * flagIndex);
for(i=1; i<k; ++i){
paths = malloc(1+sizeof(char) * (flagIndex - flagIndex));
}
//抄入数据
for(j = 0, l = 0; j < flagIndex; ++j, ++l){
paths=data;
}
paths=0;
for(i = 0; i < k-1; ++i){
for(j = flagIndex+flagLenght, l = 0; j < flagIndex; ++j, ++l){
paths=data;
}
paths=0;
}
returnValue.paths=paths;
returnValue.length=k;
return returnValue;
}
我太菜了 strsep函数应该可以做到 赚小钱 发表于 2020-6-2 22:25
写的比较丑。
我运行这个代码确实出结果 但是出结果后代码就崩了 不正常退出 Darth_EF 发表于 2020-6-3 02:20
我太菜了
可以的 很强 随风浩荡几万里 发表于 2020-6-3 18:09
我运行这个代码确实出结果 但是出结果后代码就崩了 不正常退出
for (; tmp != 0; tmp++) {
free(*tmp);
}
修改成
for (; tmp != 0; tmp++) {
if (*tmp != 0) {
free(*tmp);
}
}
上面的 print 也修改一下。都封装成函数。试一下吧,我推测是这里的问题。
页:
[1]