【问题标题】:How to store tokens(strtok) in a pointer on an array如何将令牌(strtok)存储在数组上的指针中
【发布时间】:2014-05-31 12:55:57
【问题描述】:

我仍然有一些问题,我想如果我能解决这个问题,我最终会掌握它。

我有这个linestrtok 它由分隔符空格。现在我想将所有标记存储在数组char* tokens[50] 上的指针中。我将如何将所有令牌存储在此指针中,以及在存储所有令牌后如何访问它们。我想我还需要一个柜台int token_count

【问题讨论】:

    标签: c arrays pointers token


    【解决方案1】:

    这是直截了当的。例如:

    char * tokens[50];
    size_t n = 0;
    
    for (char * p = strtok(line, " "); p; p = strtok(NULL, " "))
    {
        if (n >= 50)
        {
            // maximum number of storable tokens exceeded
            break;
        }
        tokens[n++] = p;
    }
    
    for (size_t i = 0; i != n; ++i)
    {
         printf("Token %zu is '%s'.\n", i, tokens[i]);
    }
    

    注意line 必须指向一个可变 字符串,因为strtok 会破坏字符串。

    【讨论】:

    • 在 C++ 中,您将拥有 std::vector<char *> tokenstokens.push_back(p),没有任何大小限制。
    • 非常感谢,但我真的不明白为什么我们要在 tokens[n++] = p 中增加 n
    • @user2202368: n 跟踪 tokens 中要填充的下一个插槽。
    • 所以是令牌字符或令牌本身的计数器
    • @user2202368:它是令牌本身的计数器 - 您会看到它如何用作 tokens 数组上的数组索引。 n 的最终值是已分配的数组元素的数量。
    【解决方案2】:

    为什么不在 C++11 中使用正则表达式?您可以将一个空格(一个或多个)表示为一个简单的正则表达式 "\s+" 并使用正则表达式令牌迭代器来遍历令牌,您可以从那里将令牌存储在一个向量中。这是一个仅打印的示例出代币。

    #include <regex>
    #include <string>
    #include <iostream>
    using namespace std;
    
    
    int main()
    {
    
        regex re("\\s+");
        string s = "Token1 token2   token3"; //example string
    
        sregex_token_iterator reg_end;
        for(sregex_token_iterator it(s.begin(), s.end(), re, -1); it != reg_end; ++it) {
             cout << it->str() << endl;
        }
    }
    

    【讨论】:

    • 我用的是C,没用过C++ :)
    • 使用正则表达式进行简单的子字符串搜索是彻头彻尾的犯罪。在对问题扔任意大炮之前先考虑高级算法。
    猜你喜欢
    • 2018-08-21
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    相关资源
    最近更新 更多