我想知道如何使用strtok
查找双括号之间的值,
可以使用strtok(mystr, "[]")
还是不可以?
感谢。
答案 0 :(得分:3)
根据您的评论,询问您应该使用的其他内容,我的提议是使用scanf
和scansets %[...]
,方法如下:
char inside[100];
if ( scanf( "%*[^[][%99[^]]", inside ) == 1 ) {
...
}
我知道,如果您不熟悉扫描仪,它可能看起来都是乱码,所以让我简单解释一下:
Scanset %[...]
只是另一种类型说明符,例如"%s"
和"%d"
等等。它与"%s"
非常相似,只是它很灵活。通过在[...]
中指定不以插入符号^
开头的字符,这些字符将是唯一可以读取的字符。换句话说,除指定之外的任何内容都会终止读取。
如果您开始使用插入符^
效果,则第一次遇到指定字符会终止扫描集读数。
百分号*
后面的星号%
表示“嘿,我希望您找到这些值,但我不希望您将它们存储到任何内容中,我希望它们能够被丢弃。“
因此,上面的格式字符串告诉scanf
;
'['
,"%*[^[]
部分'['
部分"["
字符
']'
字符,最大长度为99(考虑终止空值),"%99[^]]"
部分对于扫描集示例,您可以查看以下链接:https://stackoverflow.com/a/22722090/2736228
答案 1 :(得分:1)
您可以使用strtok
,如以下示例所述:
int main ()
{
char str[] ="[x][y] [z]"; // sample string
// make a copy of the original string to work on
char *wrk;
wrk = malloc(strlen(str)+1);
strcpy(wrk, str);
// we need a copy of the pointer wrk
// to be used as parameter for strtok
char *wrk2;
wrk2 = wrk;
// this will hold the pointer to the string returned from strtok
char * pch;
while(true)
{
pch = strtok(wrk2, "[]");
if( !pch ) break;
wrk2 = NULL; // subsequent calls to strtok require wrk2 to be NULL
// the value is good only if preceeded by an open bracket
// because strtok retrieve also strings between ] and [
if(pch>wrk && str[pch-wrk-1]=='[')
{
printf ("%s\n",pch);
}
}
free(wrk);
return 0;
}
请注意,为了使用strtok
来完成您所要求的,必须生成原始字符串的副本。我们称之为工作字符串 wrk
strtok(wrk, "[]")
将在[
]
]
{{1}之间的[
[
和不需要的子字符串之间检索良好子字符串}}
为了跳过不需要的字符串,我们会检查返回的子字符串是否以开括号strtok
开头。
检查这个的必要性是为什么必须创建原始字符串的副本:实际上strtok
通过放置空终止字符来编辑(拆分)工作字符串。检查是在原始未触动的字符串上进行的。
使用[[a] b]
结果非常复杂,并且需要(至少使用我建议的方法)原始字符串的副本。
此外,上述代码不会处理嵌套字符串,例如strtok
有关{{1}}的完整参考,我建议http://www.cplusplus.com/reference/cstring/strtok/