在C中双重拆分

好。 例如,我在我的txt文件中有这一行:

1|1,12;7,19;6,4;8,19;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("", help); help = strtok(NULL, ","); } result = strtok(NULL, ";"); } 

我只得到“,”,就像这组数字中只有一组一样。 我不明白其他数字在哪里。 相反,输出应该是:,,,,,,,,,。 有人可以给出一个解决方案,如何获得每组的EACH号码这组数字。 也许有其他方法或我做错了:)

谢谢!

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, ";,"); } 

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

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

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

或者,如果您确实想使用嵌套循环, 请参阅此处 。

正如其他人所指出的那样, 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); }