这将标记字符串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/

10-10 12:37