Strtok行为与分隔符

以下是代码片段。

#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_textvariables仅包含“前面板存储器状态”而不是“前面板存储器状态:可纠正的ECC /其他可纠正的存储器错误;传感器(70,存储器)”

为什么strtok考虑一个冒号作为分隔符? 任何人都可以解决此问题。

为什么strtok考虑一个冒号作为分隔符?

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

7.24.5.8 strtok函数

[…]

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

您可以尝试使用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。