Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用strtok()解析字符串中的标记_C_String_Parsing_Strtok - Fatal编程技术网

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()返回的标记始终是非空字符串

  • 如果令牌不存在

    strtok()
    将返回NULL

注意:在使用retured令牌之前,请务必检查NULL

我能做什么

构建您自己的功能,不完全是如何
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