我有一个程序,它从命令行输入多个字符串和数字变量。由于我想将少量输入转换为数字类型,因此我一直按照 learncpp 中的建议使用 std::stringstream
。目前,我的代码如下所示:
main.cpp
int main(int argc, char* argv[]) {
if (argc != 7)
{
std::cout << "Execute the program in the following format:\n";
std::cout << ".\segment inputImage outputDir color k sigma minSize\n";
std::cout << "Exiting program\n";
std::exit(1);
}
float gaussianBlur, kValue;
int minimumComponentSize;
std::filesystem::path path = std::filesystem::u8path(argv[1]);
std::string outputFolder = argv[2];
std::string color = argv[3];
std::stringstream convert{argv[4]};
if (!(convert >> gaussianBlur))
{
gaussianBlur = 1.5; // default value
}
std::stringstream convertK{argv[5]};
if (!(convertK >> kValue))
{
kValue = 900; // default value
}
std::stringstream convertMin{argv[6]};
if (!(convertMin >> minimumComponentSize))
{
minimumComponentSize = 900;
}
....
如您所见,我正在为要转换为数字类型的每个参数创建一个 stringstream
变量。我无法为 stringstream
变量重新分配另一个值。有没有办法从单个字符串流转换所有参数?有更好的方法吗?
最佳答案
您可以将所需的 argv
值写入单个 stringstream
(以空格分隔),然后将每个值读入相应的变量中:
//...
std::stringstream convert;
convert << argv[4] << " " << argv[5] << " " argv[6]; // Add more "argv" strings
convert >> gaussianBlur >> kValue >> minimumComponentSize; // Read more values
//...
但是,当然,检查错误条件会有点棘手;如果您需要这个,您可以一次读取该(单个)stringstream
中的项目,就像您已经做的那样:
if (!(convert >> gaussianBlur))
{
gaussianBlur = 1.5; // default value
}
if (!(convert >> kValue))
{
kValue = 900; // default value
}
if (!(convert >> minimumComponentSize))
{
minimumComponentSize = 900;
}
关于C++:从单个 std::stringstream 转换多个命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62385847/