您可以使用std::basic_string 成员函数对您的values 字符串进行操作,以隔离每个数字的开头数字并使用std::basic_string::substr 获取您传递给@987654323 的数字子字符串@ 将数字字符串转换为数值。
通过将各个转换后的值保存到各个变量而不是将每个转换后的值添加到诸如std::vector 之类的容器中,您会使事情变得更加困难。您可以手动执行此操作,它只需要您保留一个计数器,该计数器将分配给下一个变量,然后逻辑将计数器值协调到代码块,将转换后的值分配给该变量。 switch (counter) { ... } 和其他任何东西一样有意义。
要处理字符串,您可以使用成员函数std::basic_string::find_first_not_of(将空格跳过到数字的开头数字,然后使用std::basic_string::find_first_of 查找数字之后的下一个空格——定义开始以及要转换的数字子串的结束位置。
还有很多其他方法可以解决这个问题,但是将上面概述的内容放在一起,您可以这样做:
#include <iostream>
#include <string>
int main (void) {
std::string values {"1 2 3 4 5"};
int v1{}, v2{}, v3{}, v4{}, v5{};
constexpr int nvars = 5; /* number of variables */
size_t n = 0, pos = 0; /* var counter & pos in string */
/* loop while n less than nvars find start of digit in string */
while (n < nvars &&
(pos = values.find_first_not_of (" \t\n", pos)) != std::string::npos)
{
/* find end position after sequential digits */
size_t endpos = values.find_first_of (" \t\n", pos);
/* use stoi (substr (pos, length)) to convert to number */
int value = std::stoi (values.substr (pos, endpos - pos));
switch (n) { /* var counter coordinates assignment to var */
case 0: v1 = value; n++; break;
case 1: v2 = value; n++; break;
case 2: v3 = value; n++; break;
case 3: v4 = value; n++; break;
case 4: v5 = value; n++; break;
default: std::cerr << "count error: we shouldn't be here.\n";
return 1;
}
pos = endpos; /* update next start position to current end */
}
/* output results */
std::cout << "v1: " << v1 << "\nv2: " << v2 << "\nv3: " << v3 <<
"\nv4: " << v4 << "\nv5: " << v5 << '\n';
}
(注意:您可以使用try ... catch ... 块来捕获由std::stoi 转换引发的任何异常- 留给您)
使用/输出示例
运行程序会用您的values 字符串中的数字填充v1 到v5:
$ ./bin/stringtovars
v1: 1
v2: 2
v3: 3
v4: 4
v5: 5
查看一下,如果您还有其他问题,请告诉我。