我试图在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”)时,它给了我一些奇怪的结果,而不是我正在寻找的那个。
有什么想法吗? 感谢
答案 0 :(得分:4)
strtok
获取所有可能分隔符的char数组,并根据任何这些字符进行分割(在您的情况下,分为h
,r
,e
,或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值并返回指针继续字符串