我正在尝试创建一个tokenizer函数,但是我遇到了一个恼人的错误。我是c ++的新手,不能与语法相提并论。谢谢你能给我的任何帮助。
using namespace std;
string[] tokenizer(const string &str, const char &delim){
string tokens[3];
for(int i = 0; i < 3; i++) tokens[i] = "";
int start = 0;
int toks = 0;
for(int i = 0; i < str.length(); i++){
if (str[i] == delim){
for(int j = start; j < i; j++)
tokens[toks] += str[i];
}
}
return tokens;
}
错误在函数头中。
expected unqualified-id before '[' token
抱歉所有这些粗心的错误。我修复了它们,但我仍然遇到同样的错误。
答案 0 :(得分:1)
括号在哪里?!
if str[i] == delim{
至if (str[i] == delim){
和
tokens[i] == ""
至tokens[i] = ""
和
return toks[];
至return toks;
答案 1 :(得分:1)
你的功能的签名
string[] tokenizer(const string &str, const char &delim)
无效的C ++。执行此操作的典型方法是std::vector<>
:
std::vector<string> tokenizer(const string &str, const char &delim)
然后:
string tokens[3];
现在忘了这个。 3
甚至意味着什么?为什么不将索引编入tokens
?像这样的代码是关于C和C ++的所有邪恶和坏话的根源。使用std::vector
:
std::vector<string> tokens;
要将商品添加到std:vector
,请使用push_back()
或emplace_back()
。
然后,在C ++中迭代项目的惯用方法是使用迭代器或基于范围的:
for(auto it = str.begin(), end = str.end(); it!=end; ++it)
或......
for(auto c : str)
答案 2 :(得分:0)
你的语法很奇怪(我假设你来自Java或C#)并且缺少很多上下文,但我认为你的目标是获取一个字符串并“标记化”它。这是一个工作实现,大致基于您的代码。它无论如何都不是最佳,但它有效,你应该能够理解它。
#include <iostream>
#include <string>
#include <vector>
std::vector<std::string> tokenizer(const std::string &str,
char delim = ' ',
bool emptyok = false)
{
std::vector<std::string> tokens;
std::string t;
for(int i = 0; i < str.length(); i++)
{
if (str[i] == delim)
{
if(emptyok || (t.length() != 0))
tokens.push_back(t);
t.clear();
continue;
}
t.push_back(str[i]);
}
// And take care of anything that's left over...
if(emptyok || (t.length() != 0))
tokens.push_back(t);
return tokens;
}
int main(int, char **)
{
std::string s = "This is a test of the emergency broadcast system yo!";
std::vector<std::string> x = tokenizer(s, ' ');
for(int i = 0; i != x.size(); i++)
std::cout << "Token #" << i << ": \"" << x[i] << "\"" << std::endl;
return 0;
}