微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

strtok 跳过多个分隔符,如何让它只跳过一个

如何解决strtok 跳过多个分隔符,如何让它只跳过一个

我目前正在为 nmea 句子开发一个解析器,通常是这样的:

"$GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62\r\n"

所以我创建了这个函数,它使用 strtok 来解​​析它,使用逗号作为分隔符并将每个数据字段存储在值数组中,重要的是每个数据字段都进入数组中的正确位置。

int split_string_by_comma (nmea_message_t * message_info,char ** values)
{
    int i = 0;
    char * p = strtok(message_info->data_field,MSG_DELIMITER);
    
    while (p != NULL)
    {
        values[i++] = p;
        p = strtok(NULL,MSG_DELIMITER);
    }
    return i;
}

问题是,nmea 语句跳过某些数据字段的情况并不少见,例如:

"$GPRMC,E*62\r\n"

在这种情况下,我的函数没用,因为我希望将逗号之间的空数据字段分配为 NULL 而不是完全忽略。

有什么建议吗? 谢谢!

解决方法

strsep 可能是您想要的:

strsep() 函数被引入作为 strtok(3) 的替代品,
因为后者不能处理空字段。
但是,strtok(3) 符合 C89/C99,因此更易于移植。

它的语法并不完全相同:

#include  <stdio.h>
#include  <string.h>

#define MSG_DELIMITER ","

void split_string_by_comma (char* msg)
{
    int i = 0;
    char * p = strsep(&msg,MSG_DELIMITER);

    while (p != NULL)
    {
        printf("%d - %s\n",++i,p);
        p = strsep(&msg,MSG_DELIMITER);
    }    
}

int main(void)
{
    char good[] = "$GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62\r\n";
    char bad[] = "$GPRMC,E*62\r\n";

    split_string_by_comma(good);
    split_string_by_comma(bad);
    return 0;
}

:~/test/strsep$ ./a.out
1 - $GPRMC
2 - 081836
3 - A
4 - 3751.65
5 - S
6 - 14507.36
7 - E
8 - 000.0
9 - 360.0
10 - 130998
11 - 011.3
12 - E*62

1 - $GPRMC
2 -
3 - A
4 -
5 - S
6 - 14507.36
7 - E
8 - 000.0
9 -
10 -
11 -
12 - E*62

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。