2010-04-10 61 views
6

好的。例如,我有这条线在我的txt文件:双重分割C

1|1,12;7,19;6,4;8,19;2,2
正如你所看到的,它有2个部分,由|分离。使用;分隔符来分离第二部分1,12;7,19;6,4;8,19;2,2没有问题。但我有进一步分开,以获得每组的第一个和第二个数字的问题。

这是我当前的代码:

result = strtok(result, ";"); 

    while(result != NULL) { 
     printf("%s\n", result); 
     result = strtok(NULL, ";"); 
    } 

它输出我:

1,12
7,19
6,4
8,19
2,2

好,很好。但是,当我尝试“的strtok”(我使用分裂此方法) 这样的:

result = strtok(result, ";"); 

while(result != NULL) { 
    //printf("%s\n", result); 
    help = strtok(result, ",");  
    while(help != NULL) { 
     printf("<%s>", help); 
     help = strtok(NULL, ","); 
    } 

    result = strtok(NULL, ";"); 
} 

我只得到“< 1>,< 12>”好像有这一套只有一组数字。我不明白其余的数字在哪里。相反,输出应该是:< 1>,< 12>,< 7>,< 19>,< 6>,< 4>,< 8>,< 19>,< 2>,< 2>。有人可以给一个解决方案,如何获得每个设置这组数字的每个数字。也许还有其他方法或我做错了什么:)

谢谢!

回答

2

char * strtok(char * str,const char * delim);(来自手册页)
分隔符参数指定一组字符,用于分隔已分析字符串中的分隔符。调用者可以在解析相同字符串的连续调用中指定delim中的不同字符串。

因此,使用;,作为分隔符来获取所有数字。

//this will delimit result whenever ";" or "," is found 
result = strtok(result, ";,"); 

while(result != NULL) { 
    printf("%s\n", result); 
    result = strtok(NULL, ";,"); 
} 
1

第一个strtok将原始文件拆分为几个以null结尾的字符串。第二个strtok仅适用于这些字符串中的第一个 - 它停在由第一个strtok调用创建的第一个空终止符处。您需要为每个由第一个创建的字符串调用第二个strtok代码。

5

除了Neil指出的关于修改原始字符串的内容之外,strtok()函数的设计并非像您所描述的那样以嵌套方式使用。您可能希望调查strtok_r()功能,或者完全避免使用strtok*系列。

+0

+1,用于指向嵌套的限制。 – codaddict 2010-04-10 09:49:39

0

C的strtok是非常邪恶的,因为它修改源字符串,插入NULL代替分隔符。因此,当第二个循环到达由外部循环插入的NULL时,它停止。你想要的是将指针分别保存到你的;分隔的字符串中,然后分别将strtok分别保存。

或者,如果您确实想要使用嵌套循环,see here

+0

哇。多谢你们!很棒!从来没有想过这么简单。 – Dmitri 2010-04-10 12:17:35

0

正如其他人指出的那样,strtok()不是可重入的 - 它维护关于它正在解析的字符串的内部状态,所以它不能用于同时解析两个不同的字符串(这意味着它的两个不同的非NULL值第一个参数,所以你的情况很重要)。

如果你有重入版本strtok_r()可用,你可以改变你的代码中使用它,像这样:

char *st_result, *st_help; 
result = strtok_r(result, ";", &st_result); 

while (result) { 
    printf("[%s]", result); 
    help = strtok_r(result, ",", &st_help);  
    while (help) { 
     printf("<%s>", help); 
     help = strtok_r(NULL, ",", &st_help); 
    } 

    result = strtok_r(NULL, ";", &st_result); 
}