Сохранить строку как массив с плавающей точкой C ++ - PullRequest
0 голосов
/ 19 января 2019

Я получаю от терминала следующую строку:
"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/), stringstream (как указано в 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 голосов
/ 19 января 2019

Ваш код довольно запутан. Половина вашего кода обрабатывает строку как последовательность символов (что правильно), а другая половина обрабатывает ее как последовательность чисел с плавающей запятой, что на самом деле неверно. Например

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);

Просто, создайте поток строк, считывайте поплавки по одному, добавляйте их в вектор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...