簡體   English   中英

將正確的參數傳遞給 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表中的第一個元素是+ 2 3 ,這很好,但是,第二個元素是l 有誰明白為什么? 如果是這樣,我如何在我的args表中獲得我的ln 9

strtok() manpage

delim參數指定一組字節,用於分隔已解析字符串中的標記。 調用者可以在解析相同字符串的連續調用中在 delim 中指定不同的字符串。

因此,在您的代碼中, "\\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不是最佳選擇。 我可能會編寫自己的解析 function

  1. 使用strstr()在原始字符串中查找"\\n"次出現
  2. 將前一個字符串復制到某個 output 字符串或 null 將其終止

我完全同意 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 = '\0';
    } else {
        next = NULL;
    }

    return tok;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM