为什么strtok()没有正确迭代while循环?

时间:2016-11-02 02:47:25

标签: c strtok

我正在尝试使用strtok()拆分C中的字符串,并将我得到的值赋给数组中结构的属性。

这是字符串(预期输入)的样子:

steve 31516.john 31516.

我的代码(忽略变量定义):

while(fgets(line, sizeof(line), f) != NULL);

char* tok = strtok(line, ".");
while(tok != NULL){
    char* buf = strdup(tok);
    calendar[i].user = strtok(tok, " ");
    char* date = strtok(NULL, " ");
    calendar[i].date = atoi(date);
    tok = strtok(NULL, ".");
    free(buf);
    i++;
}

我想要的预期输出是这样的:

calendar[0].user = "steve"
calendar[0].date = 31516
calendar[1].user = "john"
calendar[1].date = 31516

然而,我得到的是:

calendar[0].user = "steve"
calendar[0].date = 31516

我遇到的问题是,似乎这个循环只发生一次,无论原始输入字符串是多久,strtok()首次运行。它在循环中正确分配变量,但它只运行一次。

1 个答案:

答案 0 :(得分:1)

以下代码应实现您要执行的操作。

#include <stdio.h>  // fopen(), fclose()
#include <stdlib.h> // exit(), EXIT_FAILURE
#include <string.h> // strtok()
#include <ctype.h>  // isspace()

int main( void )
{
    FILE * f = NULL;
    if( NULL == ( f = fopen( myFile, "r" ) ) )
    {
        perror( "fopen for myFile failed" );
        exit( EXIT_FAILURE );
    }

    // implied else, fopen successful


    #define MAX_LINE_LEN (1024)

    char line[ MAX_LINE_LEN ];
    while(fgets(line, MAX_LINE_LEN, f) != NULL) )
    {

        char* tok = strtok( line, ".");
        while( tok )
        {                       
            for( x = 0; !isspace(tok[x]); x++)
            {
                 calendar[].user[x] = tok[x];
            }

            x++; // step by the space

            calendar[i].date        = atoi( &tok[x] );

            tok = strtok(NULL, ".");
            i++;
        }
    }

请注意,上述代码并不完整,而只是您需要做的一个示例。