C 使用strtok()解析字符串中的标记
此代码的输出是C 使用strtok()解析字符串中的标记,c,string,parsing,strtok,C,String,Parsing,Strtok,此代码的输出是COPY。什么时候 char line[] = "COPY\tSTART\t0\tCOPY"; char *tmp; tmp = strtok(line, "\t"); printf("%s", tmp); 输出为START 但是!我想检查字符串开始前没有任何内容。 也就是说,我认为\t是第一个分隔符,所以strtok(行,“\t”)的输出是NULL。 但实际输出是START 有什么误解吗?我能做些什么?根据strtok()(我的重点) 已解析字符串中由两个或多个连续分隔符字节
COPY
。什么时候
char line[] = "COPY\tSTART\t0\tCOPY";
char *tmp;
tmp = strtok(line, "\t");
printf("%s", tmp);
输出为START
但是!我想检查字符串开始前没有任何内容。
也就是说,我认为\t
是第一个分隔符,所以strtok(行,“\t”)
的输出是NULL
。
但实际输出是START
有什么误解吗?我能做些什么?根据strtok()(我的重点)
已解析字符串中由两个或多个连续分隔符字节组成的序列被视为单个分隔符忽略字符串开头或结尾的分隔符字节。换句话说:strtok()返回的标记始终是非空字符串
因此,您正在体验的是strtok()
的正确行为
OTOH,strtok()
如果没有更多的令牌,将返回NULL,因此正如您所预期的,为初始分隔符返回NULL将传递错误的消息,并且会造成混乱。所以,底线是
- 如果有代币 strtok()返回的标记始终是非空字符串
- 如果令牌不存在
将返回NULLstrtok()
strtok
工作的,但您可以获得一些想法:
char line[] = "\tSTART\t0\tCOPY";
不清楚您试图执行什么操作?将跳过从字符串开头开始的分隔符。您可以使用
strep
获取”
。
#include <stdio.h>
#include <string.h>
char *scan(char **pp, char c)
{
char *s, *p;
p = strchr(*pp, c);
if (p) *p++ = '\0';
s = *pp;
*pp = p;
return s;
}
int main(void)
{
char line1[] = "COPY\tSTART\t0\tCOPY";
char line2[] = "\tSTART\t0\tCOPY";
char *p;
puts("Line 1");
p = line1;
while (p) {
printf("%s\n", scan(&p, '\t'));
}
puts("Line 2");
p = line2;
while (p) {
printf("%s\n", scan(&p, '\t'));
}
return 0;
}
Line 1
COPY
START
0
COPY
Line 2
START
0
COPY