Разделить строку в c - PullRequest
       2

Разделить строку в c

0 голосов
/ 13 октября 2011

я пытаюсь разбить строку в 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>

И я хочу, чтобы внутри переменной находились фрагменты между тегами href, такими как Horario, Oferta, Registro, но когда я пытался использовать strtok (string, "href") это дает мне какой-то странный результат, который мне не нужен.

Есть идеи?Спасибо

Ответы [ 5 ]

4 голосов
/ 13 октября 2011

strtok принимает массив символов со всеми возможными разделителями и разделяется на основе любого из этих символов (в вашем случае, разбиение на h, r, e или f), чтовероятно, почему вы видите странное поведение.

Есть ли причина, по которой вы не используете библиотеку HTML для анализа имен?

синтаксический анализатор libxml html довольно хорош: http://www.xmlsoft.org/html/libxml-HTMLparser.html

1 голос
/ 09 апреля 2017

Это мое решение, и я надеюсь, что решит вашу проблему.

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;
}
1 голос
/ 13 октября 2011

Почему бы вам просто не использовать правильный анализатор HTML? lib2xml имеет хороший синтаксический анализатор HTML в C .

0 голосов
/ 13 октября 2011

Вы можете использовать функцию сравнения строк, такую ​​как strnstr(), чтобы найти подстроки, такие как начальный и конечный теги.Затем вы можете легко рассчитать положение и длину нужной подстроки и использовать strncpy() для копирования этих данных.

0 голосов
/ 13 октября 2011

Попробуйте использовать 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, это может быть хорошим началом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...