返回多个值的函数

时间:2017-05-11 07:08:11

标签: c++ mfc

我想问一下,有人在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);
}

我希望有人可以帮我这个。

非常感谢。

2 个答案:

答案 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);
  ...
}