c - 为什么 strtok() 不以某种方式标记字符串?

标签 c string tokenize strtok

我正在尝试使用方括号 [] 作为分隔符来标记字符串。我可以用一个输入准确地标记一个字符串,但其他时候它会出错。例如,我有一个在定界符之前包含字符的字符串,它工作正常,但如果在定界符之前没有任何内容,那么我就会出错。

这个给我一个错误。 token2最终成为 NULLtoken"name]"支架还在上面。

char name[] = "[name]";
char *token = strtok(name, "[");
char *token2 = strtok(NULL, "]");

输出:

token = name]
token2 = NULL

但是,如果我有以下内容,那么它就可以正常工作。

char line[] = "Hello [name]";
char *tok = strtok(line, "[");
char *tok2 = strtok(NULL, "]");

输出:

tok = Hello
tok2 = name

当输入只是类似于 "[name]" 时,我不明白我做错了什么.我只想要括号内的内容。

编辑: 感谢大家的意见和建议。我找到了解决我正在尝试做的事情的方法。根据@Ryan 和@StoryTeller 的建议,我首先检查输入是否以 [ 开头。并用 [] 分隔.以下是我为输入所做的尝试和工作:

char name[] = "[name]", *token = NULL, *token2 = NULL;

if (name[0] == '[')
{
    token = strtok(name, "[]");
}
else
{
    token = strtok(name, "[");
    token2 = strtok(NULL, "]");
}

最佳答案

简而言之:您在第一个示例中第二次调用 strtok() 与在空字符串上调用它相同,这就是为什么您得到 NULL.

每次调用 strtok 都会根据您选择的分隔符为您提供 token 。在您的第一次尝试中:

char name[] = "[name]";
char *token = strtok(name, "[");
char *token2 = strtok(NULL, "]");

您选择的分隔符是 "[" 所以第一次调用 strtok 将得到 "name]",因为这是第一次字符串中的标记(记住字符串以定界符开头)。第二个将得到 NULL,因为 "name]" 是原始字符串的结尾,现在调用 strotk() 就像在空字符串上调用它一样。

strtok() 使用静态缓冲区来保存您的原始字符串,并且每次调用都“使用”该缓冲区的另一部分。第一次调用后,该函数“使用”了整个缓冲区。

在你的第二次尝试中:

char line[] = "Hello [name]";
char *tok = strtok(line, "[");
char *tok2 = strtok(NULL, "]");

您在中间带有定界符的字符串上调用 strtok,因此您获得了一个标记,并且函数使用的静态缓冲区中仍有一个字符串。这使得 strtok() 的第二次调用能够返回有效 token 而不是 NULL

关于c - 为什么 strtok() 不以某种方式标记字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47374393/

相关文章:

c - 如何键入用数字初始化的巨大数组的强制转换元素

c - 对浮点值进行四舍五入

python - 查找字符串中三个 ASCII 系列的重复出现

python - 将名字和姓氏标记为一个标记

c - Linux 设备驱动程序代码中的 MODULE_ALIAS 是什么?

.net - vb.net:可以将一个字符串分割成一个字符串吗

c - 0xC000005 读取时访问冲突,在 C 中使用 strcmp

c - 从 C 中的 fgets() 中修剪尾随\0

python - 我如何使用 NLTK 的默认分词器来获取跨度而不是字符串?

c - 如何修改这个程序让 child 睡5秒?