以下是代码段。
#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将单个冒号视为分隔符?任何人都可以解决这个问题。
答案 0 :(得分:6)
为什么strtok将单个冒号视为分隔符?
因为它在标准(C11)中指定:
7.24.5.8 strtok功能
[...]
- 对strtok函数的一系列调用将s1指向的字符串分解为a 标记序列,每个标记由指向的字符串中的字符分隔 由s2。序列中的第一个调用具有非null的第一个参数;随后的电话 sequence具有null第一个参数。 s2指向的分隔符字符串可以是 与来电不同。
醇>
答案 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的替代品。