字符串不会在拆分上更新其值

String does not update its value on split

本文关键字:更新 拆分 字符串      更新时间:2023-10-16

i具有一个函数,该函数将坐标作为字符串" 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

如果要使用boost,则可以使用boost :: tokenizer。

但是您无需使用Boost将字符串分开。如果您的分隔符是Whitespace字符" ",则可以简单地使用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;
}