c - 使用 strtok 的奇怪标记结果

标签 c token strtok

我的外部设备每 5 秒向我发送一次数据,如下所示:

+DATA: 43 BYTES FROM 0000:0000 (043)
Nodo_8:(T=21.45,HR=45.65,DW=9.34,Vcc=3.46V)

我需要这里的一些值来将它们保存在 mysql 数据库中。因此,通过使用 strtok,我想获得值 043、21.45、45.65、9.34、3.46。

我编写了以下从设备读取缓冲区的代码:

int learn_port(int fd)
{
   int n;
   char buff[83];

 for (;;)
  {
    n=read(fd,buff,83);
    printf("%s", buff);
    char dev_a[25] = "", temp_a[25] = "", hr_a[25] = "", dw_a[25] = "", vcc_a[25] = "";
    char* ptr;

    ptr = strtok(buff, "+DATA:BYTESFROM()\nNodo_ ,=T:HR:DW:Vcc()");
    int i = 0;
   while (ptr != NULL)
   {
     ptr = strtok(NULL, "+DATA:BYTESFROM()\nNodo_ ,=T:HR:Dw:Vcc()");
     if (i == 2)
      strcat(dev_a, ptr); // copies device
     if (i == 5)
      strcat(temp_a, ptr); // copies T
     if (i == 6)
        strcat(hr_a, ptr); // copies HR
     if (i == 7)
        strcat(dw_a, ptr); // copies DW
     if (i == 10)
        strcat(vcc_a, ptr);
    i++;
    }
    sleep(1);
    printf("%s, %s, %s, %s, %s\n", dev_a, temp_a,hr_a,dw_a,vcc_a);
 }

但是我有一些奇怪的结果,我不知道哪里有问题。终端第一时间返回我:

+DATA: 43 BYTES FROM 0000:0000 (043)
Nodo_8:(T=21.45,HR=45.65,DW=9.34,Vcc=3.46V)
??,??043, 21.45, 45.65, 9.34, 3.46

5 秒后

+DATA: 43 BYTES FROM 0000:0000 (043)
Nodo_8:(T=21.23,HR=42.65,DW=9.45,Vcc=3.46V)
?3.46043, 21.23, 42.65, 9.45, 3.46

5 秒后

+DATA: 43 BYTES FROM 0000:0000 (051)
Nodo_8:(T=21.67,HR=42.45,DW=9.23,Vcc=3.46V)
?3.46051, 21.67, 42.45, 9.23, 3.46

等 有谁知道问题出在哪里,我在 051 之前有 ?3.46? strtok有什么问题吗? 我的结果要043, 21.67, 42.45, 9.23, 3.46

最佳答案

我相信您误解了 strtok() 的第二个参数;它不是一个完整的分隔符字符串,它是一组“字符”。换句话说,字符串中的每个字符都被视为有效的分隔符。

参见 the manual page有关详细信息,请注意它说:

The delim argument specifies a set of bytes that delimit the tokens in the parsed string.

一般来说,这看起来像是你应该用普通的 sscanf() 来解决的问题,不需要使用 strtok()棘手。

关于c - 使用 strtok 的奇怪标记结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16892689/

相关文章:

security - YII 框架中的 CSRF token 多久更改一次

C、计算两个 GPS 位置之间的距离?

c - Visual Studio C 函数语法错误

c - Visual C 2012 : I am getting weird errors. 提供代码段和错误

Javascript 标记化列表到关联集合

c++ - 正则表达式的歧义可识别标记

c - 为什么我的函数不返回空指针?

C Strtok 段错误

c - 解析文档,C

c - 字符串常量前的语法错误