将字符串另存为浮点数C ++

时间:2019-01-19 15:10:08

标签: c++ arrays floating-point getline

我从终端收到以下字符串:
“ 4 4 0.2 0.5 0.3 0.0 0.1 0.4 0.4 0.1 0.2 0.0 0.4 0.4 0.2 0.3 0.0 0.5”
我的目标是将此字符串保存为arr = [4,4,0.2,...]之类的浮点数组。我不知道数组的大小,因此取决于用户写的内容。值始终用空格分隔。

我尝试使用std :: stof(如https://www.geeksforgeeks.org/stdstof-in-cpp/),字符串流(如https://www.geeksforgeeks.org/converting-strings-numbers-cc/中所述),但它们都不起作用。

试用:

cout << "Introduce the transition matrix \n";
getline (cin, trans_matrix);
std::vector<float> arr(trans_matrix.size(), 0);
int j = 0, i;
// Traverse the string
for (i = 0; trans_matrix[i] != '\0'; i++) {
    // if str[i] is ' ' then split
    if (trans_matrix[i] == ' ') {
        j++;
    }
    else {
        arr[j] = std::stof(trans_matrix[i]) // string to float
    }
}

但是编译器说:

  

没有匹配功能可调用'stof'

1 个答案:

答案 0 :(得分:1)

您的代码非常混乱。您的代码一半将字符串视为字符序列(正确),而另一半则将其视为浮点序列,但这并不是真的。例如

std::vector<float> arr(trans_matrix.size(), 0);

这将创建一个与字符串大小相同的向量。但是字符串大小是字符数,它与字符串中的浮点数不同。还有

arr[j] = std::stof(trans_matrix[i]);

trans_matrix[i]是一个字符,它不是字符串,因此不能在其上使用将字符串转换为浮点数的函数。

我试图弄清楚您不能通过编写近似正确的代码来进行编程。您必须仔细考虑您在做什么,并编写正确的代码。您必须对概念完全清楚和精确。

如果您正在阅读std::cout,该怎么做?如果您从字符串中读取内容,则使用完全相同的方式,只是使用std::istringstream而不是std::cout。这是一种简单的方法。

#include <sstream>

std::vector<float> arr;
std::istringstream input(trans_matrix);
float f;
while (input >> f)
    arr.pusk_back(f);

简单,创建一个字符串流,一次读取一个浮点数,然后将它们添加到向量中。