这将标记字符串str中以空格分隔的字段:
float values[2*linesnum(str, length)];
char * pch;
pch = strtok(str, " ");
while (pch != NULL) {
printf("%s\n", pch);
pch = strtok(NULL, " ");
}
linesnum()只计算字符串中的“\n”字符数。上面的代码正确地打印了str中我期望的所有值。
但是,这只打印第一个值,之后每秒钟打印一个值:
int k = 0;
float values[2*linesnum(data, length)];
char * pch;
pch = strtok(data, " ");
while (pch != NULL) {
values[k] = atof(pch);
//printf("%s\n", pch);
printf("%f\n", values[k]);
pch = strtok(NULL, " ");
k++;
}
下面是输入字符串的外观示例:
3.31 2.16
4.28 0.56
7.20 3.09
11.18 5.06
在第一个代码中,它将输出:
3.31
2.16
4.28
0.56
7.20
3.09
11.18
5.06
在第二个代码中,它将输出:
3.310000
2.160000
0.560000
3.090000
5.060000
我一定是在做傻事。它是否只将一半的值放入数组中?为什么,如果我直接打印字符串pch时所有值都显示出来?就好像一个命令
pch = strtok(NULL, " ");
产生两个输出,而我只能捕获一个。 最佳答案
问题是字符串看起来像这样:"1.234 5.678\n9.012 3.456"
,即第二个和第三个数字(以及第四个和第五个数字,等等)由一个'\n'
字符分隔,而不是' '
字符。要解决此问题,您只需将'\n'
添加到分隔符字符串中:
pch = strtok(NULL, " \n");
只需注意:您的原始代码似乎起作用的原因是,读取的第二个值实际上(在我的示例中)是
"5.678\n9.012"
,在打印时,它看起来像5.678
9.012
尽管它看起来像两个值,但实际上它只是一个字符串。
关于c - C:strtok将所有值返回给printf,仅将一半值返回给数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9124156/