我每隔10秒钟从外部机器(总共4行)收到一些数据,如:
Yesterday match:
Player_1:(P=31,Reb=12)
Yesterday match:
Player_2:(P=12,Reb=2)
我有以下代码读取数据(我也打开并配置串口功能):
int learn_data(int fd)
{
int n,i;
char buff[200];
memset(buff, 0, sizeof(buff));
char* ptr;
FILE *fp=fdopen(fd,"r");
while(fgets(buff, sizeof(buff), fp) != NULL)
{
printf("%s", buff);
}
}
使用此代码,fgets逐行读取缓冲区。现在我的问题是,如何使用strtok获得积分和篮板(31,12),(12,2)等的值?我怎么能逃脱第一和第三线?
答案 0 :(得分:0)
如果你有一个格式良好的输入,你可以使用sscanf()
。请尝试以下方法:
int P, Reb;
sscanf(buff, "%*7s%*d%*4s%d%*5s%d", &P, &Reb);
要仅处理Player*
,您可以先memcmp()
进行操作。像,
if(memcmp(buff, "Player_", 7) == 0) ...
答案 1 :(得分:0)
这取决于播放器名称的格式 - 特别是名称是否包含空格。我可能会用:
while (fgets(buff, sizeof(buff), fp))
{
int points, rebounds;
if (sscanf(buff, "%100[^(](P=%d,Reb=%d)", &points, &rebounds) == 2)
...process a valid entry...
}
这将有效地跳过奇数行(带有匹配信息的那些),并且只会处理那些带有名字以及积分和反弹数字的行。