我想问一下,有人在VC ++上尝试了一个返回多个数据或值的函数。我想在标记字符串后存储值。示例值 00:00-10:00,11:00-14:00,16:00-21:00 。如您所见,时间由3个部分分隔,用逗号(,)分隔。使用strtok,我可以分开字符串。
char *token = strtok(stringabove,",");
while(token)
{
separatedvalues = token;
token = strtok(NULL,",");
}
return(separatedvalues);
使用矢量的代码。
vector<CString> MyFunction::Scheduler(CString value)
{
char temp[250];
sprintf(temp,"%s",value);
vector<CString> result;
char *token = strtok(temp,",");
while(token)
{
result.push(token;
token = strtok(NULL,",");
}
return(result);
}
我希望有人可以帮我这个。
非常感谢。
答案 0 :(得分:2)
C和C ++不支持返回多个值 但是,它们可以在组合时返回。
组合它们的一种方法是使用不同的变量构建一个结构。
struct Result
{
std::string res1;
std::string res2;
std::string res3;
};
当然,结果可以有不同的类型,但这是问题的结果。
所以在这种情况下,你不要在循环中进行标记化,而是一个接着一个地检查结果是否有效
Result splitTimeString(const std::string& input)
{
Result res;
// do the tokenizing and fill the result
return res;
}
用法:
Result res = splitTimeString(inp);
std::cout << res.res1;
如果您事先不知道结果的数量,但它们具有相同的类型,则可以使用容器(例如std::vector
)而不是结构。
您也可以使用std :: tuple或std :: pair(有时被视为惰性程序员的结构)而不是结构,但这具有使用std::tie
直接分配给单独变量的优点:
std::tuple<std::string, std::string, std::string> splitTimeStringToTuple(const std::String& inp)
{
std::string res1, res2, res3;
// tokenize
return std::make_tuple(res1, res2, res3);
}
std::string res1, res2, res3;
std::tie(res1, res2, res3) = splitTimeStringToTuple(inp);
答案 1 :(得分:1)
你可能想要这样的东西:
vector<CString> Test(CString value)
{
char temp[250];
sprintf(temp, "%s", value);
vector<CString> result;
char *token = strtok(temp, ",");
while (token)
{
result.push_back(CString(token)); // We need to push a CString not a char*
token = strtok_s(NULL, ",");
}
return(result);
}
int main()
{
CString value = "ab,cd,ef";
vector<CString> result = Test(value);
...
}
有更优雅,更有效的方式,但这接近你的尝试。
否则这更有效(参见Joe Willcoxson在下面的评论):
void Test(CString value, vector<CString> & result)
{
char temp[250];
sprintf(temp, "%s", value);
char *token = strtok(temp, ",");
while (token)
{
result.push_back(CString(token)); // We need to push a CString not a char*
token = strtok_s(NULL, ",");
}
}
int main()
{
CString value = "ab,cd,ef";
vector<CString> result;
Test(value, result);
...
}