行。例如,我在我的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, ";");
}
它输出我:
好的,太好了。但是当我试图'strtok'时(我正在使用这种方法进行分裂) 像这样:1,12
7,19
6,4
8,19
2,2
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, ";");
}
我只得到“&lt; 1&gt;,&lt; 12&gt;”比如这组数字中只有一组。我不明白其他数字在哪里。相反,输出应为:1,&lt; 12&gt;,&lt; 7&gt;,&lt; 19&gt;,&lt; 6&gt;,&lt; 4&gt;,&lt; 8&gt;,&lt; 8&gt;,&lt; 2&gt;,&lt; 2&gt; ,&LT; 2。有人可以给出一个解决方案,如何获得每组的EACH号码这组数字。也许还有其他方法或者我做错了什么:)
谢谢!
答案 0 :(得分:6)
除了Neil指出的有关修改原始字符串的内容之外,strtok()
函数并非设计为以您描述的嵌套方式使用。您可能希望调查strtok_r()
函数,或完全避免使用strtok*
系列。
答案 1 :(得分:3)
char * strtok(char * str,const char * delim); (来自手册页)
delim 参数指定一组字符,用于分隔已解析字符串中的标记。调用者可以在解析相同字符串的后续调用中的 delim 中指定不同的字符串。
因此,使用;
和,
作为分隔符来获取所有数字。
//this will delimit result whenever ";" or "," is found
result = strtok(result, ";,");
while(result != NULL ) {
printf("%s\n", result);
result = strtok(NULL, ";,");
}
答案 2 :(得分:1)
第一个strtok将原始文件拆分为多个空终止字符串。第二个strtok仅应用于这些字符串中的第一个 - 它在第一个strtok调用创建的第一个空终止符处停止。您需要为第一个创建的字符串调用第二个strtok代码。
答案 3 :(得分:1)
正如其他人所指出的那样,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);
}
答案 4 :(得分:0)
C strtok
非常邪恶,它修改了源字符串,插入NULL代替分隔符。因此,当第二个循环到达外部循环插入的NULL时,它会停止。您想要的是将指针保存到;
- 其他地方的分隔字符串,然后分别保存strtok
每个字符串。
或者,如果您确实想使用嵌套循环,see here。