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功能
[……]
您可以尝试使用
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;
}