将正确的参数传递给 strtok

Passing the right argument to strtok

我有这个字符串,我试图用 strtok():

分隔

"+ 2 3\nln 9\ln 10"

然后我将 \n 作为分隔符传递

    token = strtok(argv, "\n");

    while (token)
    {
            args[index] = token;
            token = strtok(NULL, "\n");
            index++;
    }

我的 args table 中的第一个元素是 + 2 3 ,这很好,但是,第二个元素是 l。 有谁明白为什么?如果是这样,我如何在我的 args table 中获得我的 ln 9

来自 strtok() manpage:

The delim argument specifies a set of bytes that delimit the tokens in the parsed string. The caller may specify different strings in delim in successive calls that parse the same string.

因此,在您的代码中,"\n" 不是 完整字符串 分隔符。您只是对 strtok 说定界符是 '\'(因为双重退格转义) 'n'.

您的字符串 "+ 2 3\nln 9\ln 10" 的标记将是:

  1. "+ 2 3"
  2. \\ 之间的空字符串(strtok 不显示)
  3. \n 之间为空(strtok 不显示)
  4. "l"
  5. " 9"
  6. \\ 之间的空字符串(strtok 不显示)
  7. "l"
  8. " 10"

为了执行您正在尝试做的事情,strtok 不是最佳选择。我可能会编写自己的解析函数

  1. 使用 strstr()
  2. 在原始字符串中查找 "\n" 次出现
  3. 要么将前一个字符串复制到某个输出字符串,要么用空值终止它

我完全同意 Roberto 和 Gerhardh 的上述回答和建议。

如果您对多定界符的 strtok 自定义实现没有问题,您可以使用以下可行的解决方案。

char *strtokm(char *str, const char *delim)
{
    static char *tok;
    static char *next;
    char *m;

    if (delim == NULL) return NULL;

    tok = (str) ? str : next;
    if (tok == NULL) return NULL;

    m = strstr(tok, delim);

    if (m) {
        next = m + strlen(delim);
        *m = '[=10=]';
    } else {
        next = NULL;
    }

    return tok;
}