C:strtok将所有值返回printf,仅将一半值返回数组

C:strtok将所有值返回printf,仅将一半值返回数组,c,string,strtok,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中我期望的所有值 但是,这仅打印第一个值,然后每隔一秒打印一个值:

这将标记字符串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
在第二个代码中,它将打印出:

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

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

提示:在不检查数组索引的情况下,永远不要编写填充数组的代码。在上面的代码中,您不知道strtok返回的行数是否超过
2*linesnum(数据,长度)
,如果是这样,您的程序就死了,死了,死了。根据输入的文件的规格,strtok应该始终生成文件中正好2倍的行数。尽管如此,您的建议是正确的,非常感谢。不要告诉我们您是如何更改代码的。向我们显示导致问题的确切未编辑代码。当您说“仅值的一半”时,您是指每秒钟一次还是指前一半?听起来你是指每一秒,但我想我会确定的。@肯:每一秒。(除了第一个值,它在那里)。哦,当然!我上当受骗,以为strtok会自动在'\n'上中断。非常感谢。是的,这就是为什么应该输出字符串,比如
printf(“\'%s\'\n”,pch)以查看范围。