C:strtok返回printf的所有值,只返回数组的一半值

时间:2012-02-03 05:35:20

标签: c string strtok

这应该标记字符串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 个答案:

答案 0 :(得分:3)

问题似乎是你的字符串看起来像这样:"1.234 5.678\n9.012 3.456",即第二个和第三个数字(以及第四个和第五个数字,依此类推)由{{1}分隔}字符,而不是'\n'字符。要解决此问题,您只需将' '添加到您的分隔符字符串:

'\n'

请注意:您的原始代码看起来有效的原因是读取的第二个值实际上是(在我的示例中)pch = strtok(NULL, " \n"); ,在打印时看起来像

"5.678\n9.012"

即使它看起来像两个值,但实际上它只是一个字符串。