strtok()不处理第二个令牌

用户名

我想从字符串中获取令牌,然后获取令牌的子令牌,例如以下简短程序:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void f(char *bak) 
{ 
    char *token, *delim = "."; 

    token = strtok(bak, delim); 
    while(token) { 
        printf("f(): token: %s\n", token); 
        token = strtok(NULL, delim); 
    } 
} 

int main(void) 
{ 
    char str[] = "a.1.2 x.y"; 
    char *token, *delim = " \t\n\r"; 

    token = strtok(str, delim); 
    while(token) { 
        printf("main: token: %s\n", token); 

        char bak[100]; 
        strncpy(bak, token, sizeof(bak)); 
        f(bak); 

        token = strtok(NULL, delim); 
    } 

    return 0; 
}

但是,它仅显示第一个标记(“ a.1.2”),而不显示第二个标记:

main: token: a.1.2
f(): token: a
f(): token: 1
f(): token: 2

这怎么发生的?谢谢。

无聊的男孩

strtok()一次只能处理一个字符串的标记化(它依赖于内部静态变量来维护连续调用之间的状态,即不可重入和非线程安全)。要在通话strtok(bak, delim)f()无效化之前调用strtok(str, delim)main(),所以当执行流程将返回main()f()和来调用strtok(NULL, delim),它实际上仍的标记化工作"a.1.2"(这是在已完成f()),从而token被赋予一个空指针值,终止循环。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

strtok()不处理第二个令牌

来自分类Dev

多路复用器不处理第二个输入处理器

来自分类Dev

多路复用器不处理第二个输入处理器

来自分类Dev

为什么错误处理程序不处理第二个错误?

来自分类Dev

为什么第二个for循环不执行?

来自分类Dev

为什么第二个for循环不执行?

来自分类Dev

变量不传递给第二个php

来自分类Dev

getopts与第二个参数不匹配

来自分类Dev

ng-if不隐藏第二个元素

来自分类Dev

为什么不评估第二个ifelse?

来自分类Dev

不启动第二个活动之间的交流

来自分类Dev

Android finishAndRemoveTask 不启动第二个活动

来自分类Dev

第二个承诺不运行(NodeJS)

来自分类Dev

批处理中的第二个命令

来自分类Dev

WPF findancestor无法处理第二个项目

来自分类Dev

第二个INSERT INTO未处理

来自分类Dev

C ++ strtok跳过第二个标记或连续的定界符

来自分类Dev

识别第二个实例

来自分类Dev

jQuery第二个孩子

来自分类Dev

OpenProcess第二个参数

来自分类Dev

第二个FOR循环被跳过

来自分类Dev

第二个HttpURLConnection失败

来自分类Dev

安装第二个mysql

来自分类Dev

等待第二个承诺

来自分类Dev

第二个活动是空白的

来自分类Dev

如何从单个字符串中获取第二个令牌?

来自分类Dev

:eq不选择第二个div而选择第一个| jQuery的

来自分类Dev

滚动第二个UITableView与第二个UITableView一致

来自分类Dev

CSS选择的第二个孩子,从第二个开始