这是在C ++(Eclipse Mars,如果重要的话,编译器MinGW)。让我们说我想将一个字符串拆分成一个字符上的两个字符串,然后使用一个函数:
int strParse(const string& a) {
// parse line read input
int b = a.find("-");
firstsplit = a.substr(0, b);
secsplit = a.substr(b + 1);
return 0;
}
但我想将firstsplit
和secsplit
定义为不是全局变量,而是在main()
范围内,以及它们的使用范围。当它们在那里被定义时,它们不能在函数中使用,但是我需要函数来定义它们以便在main
的一部分中使用。
答案 0 :(得分:9)
您当然可以在main()
中定义它们并通过引用传递它们。但那很草率。
如果您要分析这种情况,firstsplit
和secsplit
就是您的函数计算的内容。
因此,您的函数应该返回这些值。这就是函数的全部内容:它计算一些东西,然后返回它。
这样做的一种方法是简单地返回std::pair
。
std::pair<std::string, std::string> strParse(const string& a) { //parse line read input
int b = a.find("-");
std::string firstsplit = a.substr(0, b);
std::string secsplit = a.substr(b + 1);
return std::make_pair(firstsplit, secsplit);
}
但是如果你的函数也可能需要返回别的东西,或者其他一些替代结果,例如错误指示,这会导致更多的工作和更多的重写。
最灵活的方法是让函数返回一个类:
class parse_results {
public:
std::string firstsplit;
std::string secsplit;
};
parse_results strParse(const string& a) { //parse line read input
parse_results ret;
int b = a.find("-");
ret.firstsplit = a.substr(0, b);
ret.secsplit = a.substr(b + 1);
return ret;
}
然后,如果您需要在此处返回任何类型的附加信息,可以将其添加到parse_results
类中。
答案 1 :(得分:1)
我建议你在main中声明两个std::string
,然后将它们作为参数传递给函数。如果这不是您要查找的行为,则可以使该函数返回std::vector<string>
。
我想指出string::find()
方法返回size_t
而不是int
。如果您不确定某种类型,可以随时使用auto
。
答案 2 :(得分:0)
试 int strParse(const string&amp; a,string&amp; firstsplit,string&amp; secsplit)
答案 3 :(得分:0)
您的int
返回值无用;它始终为0.相反,只需返回两个元素struct
或std::array
中的两个字符串。