gpt4 book ai didi

c - 在 C 中拆分不带引号的字符串

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

我正在编写一个将字符串拆分为指向指针的指针的函数,如果分隔符是空格,我只想拆分不在引号内的单词。例如 Hello world "not split" 应该返回

Hello
world
"not split"

函数以某种方式拆分了引号内的单词而不拆分引号外的单词。

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

int is_quotes(char *s)
{
int i;
int count;

i = 0;
count = 0;
while (s[i])
{
if (s[i] == '"')
count++;
i++;
}
if (count == 0)
count = 1;
return (count % 2);
}

int count_words(char *s, char sep)
{
int check;
int i;
int count;

check = 0;
if (sep == ' ')
check = 1;
i = 0;
count = 0;
while (*s && *s == sep)
++s;
if (*s)
count = 1;
while (s[i])
{
if (s[i] == sep)
{
if (!is_quotes(s + i) && check)
{
i += 2;
while (s[i] != 34 && s[i])
i++;
}
count++;
}
i++;
}
return (count);
}

char *ft_strsub(char const *s, unsigned int start, size_t len)
{
char *sub;

sub = malloc(len + 1);
if (sub)
memcpy(sub, s + start, len);
return (sub);
}

char **ft_strsplit(char const *s, char c)
{
int words;
char *start;
char **result;
int i;

words = count_words((char *)s, c);
if (!s || !c || words == 0)
return (NULL);
i = 0;
result = (char **)malloc(sizeof(char *) * (words + 1));
start = (char *)s;
while (s[i])
{
if (s[i] == c)
{
if (is_quotes((char *)s + i) == 0 && c == ' ')
{
i += 2;
while (s[i] != '"' && s[i])
i++;
i -= 1;
}
if (start != (s + i))
*(result++) = ft_strsub(start, 0, (s + i) - start);
start = (char *)(s + i) + 1;
}
++i;
}
if (start != (s + i))
*(result++) = ft_strsub(start, 0, (s + i) - start);
*result = NULL;
return (result - words);
}

int main(int argc, char **argv)
{
if (argc > 1)
{
char **s;
s = ft_strsplit(argv[1], ' ');
int i = 0;
while (s[i])
printf("%s\n", s[i++]);
}
return 0;
}

当我用 hello world "hello hello" 运行这段代码时,我得到以下结果

hello world
"hello
hello"

最佳答案

你需要一个有两种状态的状态机,on quote 和 off quote。当您点击报价时,翻转状态。当你打一个空格时,如果不引用则转换为换行符,而不是如果引用。(您很快就会想要让它更精细以允许字符串转义等,状态机方法可以扩展到那个)。

关于c - 在 C 中拆分不带引号的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41316369/

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