c:如何使用strtok()进行双括号?

时间:2014-03-31 20:07:04

标签: c

我想知道如何使用strtok查找双括号之间的值, 可以使用strtok(mystr, "[]")还是不可以? 感谢。

2 个答案:

答案 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/