gpt4 book ai didi

C字符串嵌套拆分

转载 作者:太空宇宙 更新时间:2023-11-04 08:03:31 24 4
gpt4 key购买 nike

我是 C 的初学者,我被一个简单的问题困住了。开始了:
我有一个格式如下的字符串:"first1:second1\nsecond2\nfirst3:second3"...等等。
从示例中可以看出,第一个字段是可选的 ([firstx:]secondx)。
我需要得到一个只包含第二个字段的结果字符串。像这样:“second1\nsecond2\nsecond3”。

我在这里对堆栈 (string splitting in C) 做了一些研究,我发现 C 中有两个主要函数用于字符串拆分:strtok(已过时)和 strsep .
我尝试使用这两个函数(加上 strdup)编写代码,但没有成功。大多数时候我会得到一些不可预知的结果。

更好的想法?
提前致谢

编辑:
这是我的第一次尝试

int main(int argc, char** argv){
char * stri = "ciao:come\nva\nquialla:grande\n";
char * strcopy = strdup(stri); // since strsep and strtok both modify the input string
char * token;
while((token = strsep(&strcopy, "\n"))){
if(token[0] != '\0'){ // I don't want the last match of '\n'
char * sub_copy = strdup(token);
char * sub_token = strtok(sub_copy, ":");
sub_token = strtok(NULL, ":");
if(sub_token[0] != '\0'){
printf("%s\n", sub_token);
}
}
free(sub_copy);
}
free(strcopy);
}

预期输出: "come", "si", "grande"

最佳答案

这是一个使用 strcspn 的解决方案:

#include <stdio.h>
#include <string.h>

int main(void) {
const char *str = "ciao:come\nva\nquialla:grande\n";
const char *p = str;
while (*p) {
size_t n = strcspn(p, ":\n");
if (p[n] == ':') {
p += n + 1;
n = strcspn(p , "\n");
}
if (p[n] == '\n') {
n++;
}
fwrite(p, 1, n, stdout);
p += n;
}
return 0;
}

我们计算不包含 :\n 的初始段的大小。如果它后面跟着 :,我们将跳过它并获取不包含 \n 的下一个片段。

如果其后跟\n,我们在段中包含换行符。然后我们只需要输出当前段并更新 p 以相同的方式继续处理字符串的其余部分。

我们在 *p'\0' 时停止,即到达字符串末尾时。

关于C字符串嵌套拆分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44342520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com