我有一个函数,该函数以字符串“ 1.12 1.28”接收坐标。我必须拆分字符串,并将两个值都分配给浮点变量(x = 1.12和y = 1.28)。问题是,当我将字符串拆分为单独的值时,它将停止为字符串分配新值。
当我运行下面的代码时,它将打印整个字符串并在每次迭代时进行更新。
void print_coordinates(string msg, char delim[2])
{
cout << msg;
cout << "\n";
}
int main()
{
SerialIO s("/dev/cu.usbmodem1441");
while(true) {
print_coordinates(s.read(), " ");
}
return 0;
}
输出:
1.2 1.4
1.6 1.8
3.2 1.2
但是当我运行下面的代码时,它将停止更新字符串。
void print_coordinates(string msg, char delim[2])
{
float x = 0;
float y = 0;
vector<string> result;
boost::split(result, msg, boost::is_any_of(delim));
x = strtof((result[0]).c_str(), 0);
y = strtof((result[1]).c_str(), 0);
cout << x;
cout << " ";
cout << y;
cout << "\n";
}
int main()
{
SerialIO s("/dev/cu.usbmodem1441");
while(true) {
print_coordinates(s.read(), " ");
}
return 0;
}
输出:
1.2 1.4
1.2 1.4
1.2 1.4
答案 0 :(得分:4)
如果要使用boost,可以只使用boost::tokenizer。
但是您不需要使用Boost来分隔字符串。
如果分隔符是空格字符" "
,则只需使用std :: stringsstream。
void print_coordinates(std::string msg)
{
std::istringstream iss(msg);
float x = 0;
float y = 0;
iss >> x >> y;
std::cout << "x = " << x << ", y = " << y << std::endl;
}
如果要指定分隔符
void print_coordinates(std::string msg, char delim)
{
std::istringstream iss(msg);
std::vector<float> coordinates;
for(std::string field; std::getline(iss, field, delim); )
{
coordinates.push_back(::atof(field.c_str()));
}
std::cout << "x = " << coordinates[0] << ", y = " << coordinates[1] << std::endl;
}