Strtok行为与分隔符

时间:2015-04-24 09:00:55

标签: c linux

以下是代码段。

#define TABLE_DELIMITER "::"
int parse_n_store ( char *line )
{

        int i = 0;
        char *p = NULL;
        CPTR sensor_number = NULL , event_catagory = NULL, sensor_type = NULL, event_state= NULL, assertion = NULL, message_number = NULL, short_text = NULL;

        for (p = strtok(line,TABLE_DELIMITER); p != NULL; p = strtok(NULL, TABLE_DELIMITER), i++ )
        {
                if ( i == 0 )
                        sensor_number=p;
                else if ( i == 1 )
                        sensor_type = p;
                else if ( i == 2 )
                        event_catagory = p;
                else if ( i == 3 )
                        event_state = p;
                else if ( i == 4 )
                        assertion = p;
                else if ( i == 5 )
                        message_number = p;
                else if ( i == 6 )
                        short_text = p;
        }

        printf ("%s %s %s %s %s %s %s\n", sensor_number, event_catagory, sensor_type, event_state, assertion, message_number, short_text);
}

这很好用。但是,当"线"参数是"前面板内存状态:检测到可纠正的ECC /其他可纠正的内存错误;传感器(70,记忆)"

输出

70 SENSOR_SPECIFIC MEMORY STATE_00 True 8543前面板内存状态

其中short_text变量仅包含"前面板内存状态"而不是"前面板内存状态:检测到可纠正的ECC /其他可纠正的内存错误;传感器(70,记忆)"

为什么strtok将单个冒号视为分隔符?任何人都可以解决这个问题。

2 个答案:

答案 0 :(得分:6)

  

为什么strtok将单个冒号视为分隔符?

因为它在标准(C11)中指定:

  

7.24.5.8 strtok功能

     

[...]

     
      
  1. 对strtok函数的一系列调用将s1指向的字符串分解为a   标记序列,每个标记由指向的字符串中的字符分隔   由s2。序列中的第一个调用具有非null的第一个参数;随后的电话   sequence具有null第一个参数。 s2指向的分隔符字符串可以是   与来电不同。
  2.   

答案 1 :(得分:1)

您可以尝试使用strstr来迭代字符串,因为它可以查找子字符串。

您可以定义(注意未经测试):

char *strmtok(char *s, char *delim) {
    static char *current = NULL;
    char *ix, *cr;

    if (s != NULL) { 
        current = s;
    }
    ix = strstr(current, delim);
    if (ix == NULL) return NULL;
    cr = current;
    current = ix + strlen(delim);
    *ix = '\0';
    return cr;
}

并将其用作原始strtok的替代品。