【发布时间】:2014-05-31 12:55:57
【问题描述】:
我仍然有一些问题,我想如果我能解决这个问题,我最终会掌握它。
我有这个line 我strtok 它由分隔符空格。现在我想将所有标记存储在数组char* tokens[50] 上的指针中。我将如何将所有令牌存储在此指针中,以及在存储所有令牌后如何访问它们。我想我还需要一个柜台int token_count。
【问题讨论】:
我仍然有一些问题,我想如果我能解决这个问题,我最终会掌握它。
我有这个line 我strtok 它由分隔符空格。现在我想将所有标记存储在数组char* tokens[50] 上的指针中。我将如何将所有令牌存储在此指针中,以及在存储所有令牌后如何访问它们。我想我还需要一个柜台int token_count。
【问题讨论】:
这是直截了当的。例如:
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 会破坏字符串。
【讨论】:
std::vector<char *> tokens 和 tokens.push_back(p),没有任何大小限制。
tokens[n++] = p 中增加 n
n 跟踪 tokens 中要填充的下一个插槽。
tokens 数组上的数组索引。 n 的最终值是已分配的数组元素的数量。
为什么不在 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;
}
}
【讨论】: