C 带分隔符的Strtok行为

C 带分隔符的Strtok行为,c,linux,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 = N

下面是代码片段

#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);
}
这个很好用。但是,当“line”参数为“Front Board Memory status:可纠正的ECC/其他可纠正的内存错误检测到;传感器(70,内存)”时

输出将是

70传感器特定存储器状态\u 00真实8543前板存储器状态

其中,short_文本变量仅包含“前板内存状态”,而不是“前板内存状态:检测到可纠正ECC/其他可纠正内存错误;传感器(70,内存)”

为什么strtok将单个冒号作为分隔符?谁能解决这个问题

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

因为标准(C11)中有规定:

7.24.5.8 strtok功能

[……]

  • 对strtok函数的一系列调用将s1指向的字符串分解为 标记序列,每个标记由指向的字符串中的一个字符分隔 由s2。序列中的第一个调用具有非空的第一个参数;中的后续调用 序列的第一个参数为空。s2指向的分隔符字符串可能是 不同的电话

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

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


    并将其用作原始strtok的替换。

    strtok的第二个参数中的字符串中的每个字符都是delimeter。
    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;
    }