我正在尝试使用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()首次运行。它在循环中正确分配变量,但它只运行一次。
答案 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++;
}
}
请注意,上述代码并不完整,而只是您需要做的一个示例。