我正在尝试使用方括号 [] 作为分隔符来标记字符串。我可以用一个输入准确地标记一个字符串,但其他时候它会出错。例如,我有一个在定界符之前包含字符的字符串,它工作正常,但如果在定界符之前没有任何内容,那么我就会出错。
这个给我一个错误。 token2
最终成为 NULL
和 token
是"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/