在c中拆分字符串

时间:2011-10-12 21:27:23

标签: c split

我试图在C中拆分字符串(不是在C#,C ++或任何其他类型)。我尝试使用de strtok函数,但事实证明这只适用于每个单词之间的限制是单个字符这样的空格,分号....

我有一个变量,它是一个包含html代码的字符串,如下所示:

</head>
<body>
Index of /davidgoudet
<ul><li><a href="/"> Parent Directory</a></li>
<li><a href="Horario/"> Horario/</a></li>
<li><a href="Oferta/"> Oferta/</a></li>
<li><a href="Registro/"> Registro/</a></li>
</ul>
<address>Apache mod_fcgid/2.3.6 mod_auth_passthrough/2.1 mod_bwlimited/1.4                FrontPage/5.0.2.2635 Server at turpialdevelopment.com Port 80</address>
</body></html>

我希望在Horario,Oferta,Registro等href标签之间放置一个变量块 但是当我试图使用strtok(字符串,“href”)时,它给了我一些奇怪的结果,而不是我正在寻找的那个。

有什么想法吗? 感谢

6 个答案:

答案 0 :(得分:4)

strtok获取所有可能分隔符的char数组,并根据任何这些字符进行分割(在您的情况下,分为hre,或f),这可能是你看到奇怪行为的原因。

您是否有理由不使用HTML解析库来提取名称?

libxml html解析器非常好:http://www.xmlsoft.org/html/libxml-HTMLparser.html

答案 1 :(得分:1)

为什么不使用正确的HTML解析器? lib2xml has a nice HTML parser in C

答案 2 :(得分:1)

这是我的解决方案,我希望能解决您的问题。

int split(char ***dst, char *str, char spliter)
{
    int str_num = 0;    
    int each_size;   
    int index = 0;     
    int str_index = 0;  
    int start_index = 0;

    while (str[index] != '\0')
    {
        if (str[index] == spliter)
        {
            str_num++;
            index++;
            while(str[index] == spliter)
            {
                index++;
            }
        }
        else
       {
            index++;
       }
    }
    str_num++;

    *dst = (char **) malloc((str_num + 1)*sizeof(char*));
    index = 0;

    while (str[index] != '\0')
    {
        if (str[index] != spliter)
        {
            start_index = index;
            each_size = 0;

            while (str[index] != spliter && str[index] != '\0')
            {
                index++;
                each_size++;
            }

            (*dst)[str_index] = (char*) malloc((each_size + 1)*sizeof(char));
            int cur_i = 0;

            while (start_index != index)
            {
                (*dst)[str_index][cur_i] = str[start_index];
                start_index++;
                cur_i++;
            }

            (*dst)[str_index][cur_i] = '\0';
            str_index++;
        }
        else
        {
            index++;
        } 
    }

    (*dst)[str_num] = NULL;
    return str_num;
}

答案 3 :(得分:0)

尝试使用strstr()然后偏移它返回给你的指针。

strstr(big_string_of_tags,"href")+6; //Leaves pointer at the word you're seeking, read up until you see a double quote char.

它不是一个非常优雅的解决方案,但如果你仅限于C,那可能是一个好的开始。

答案 4 :(得分:0)

您可以使用像strnstr()这样的字符串比较函数来定位子字符串,例如开始和结束标记。然后,您可以轻松计算所需子字符串的位置和长度,并使用strncpy()复制该数据。

答案 5 :(得分:0)

char* split(char *string, char chr, char *output){
    int seek=0;
    for(seek; seek<strlen(string); seek++){
        if( *(string + seek) == chr ){
            break;
        }
    }
    memcpy(output, string  , seek);
    *(output + seek ) = '\0';
    if( (seek + 1) >= strlen(string)){
        return NULL;
    }
    return (string + seek + 1);
}

使用:

char *string = "hello world";

while(1){
    string = split(string, ' ', out);
    if(string == NULL) break;
}

在(out)设置cut值并返回指针继续字符串