Что не так с этим кодом? Мне нужно конвертировать строку в float

Что не так с этим кодом? Мне нужно конвертировать строку в float. м2 имеет ошибку в m2.length

#include <iostream>
#include <string>
#include <cstdlib>
#include <sstream>
using namespace std;

int main()
{
float v2;
char *m2 = "1 23 45 6";
for (int i = 0; i < m2.length(); i++) //to convert every element in m2 into float
{
v2 = atof(&m2[i]);
}
printf("%.2f", v2);

system("pause");
return 0;
}

-8

Решение

Мне нужно преобразовать каждый элемент в массиве, чтобы я мог сохранить их для выполнения операций

Хорошо, а как насчет того, чтобы использовать поток строк для извлечения чисел из строки в вектор?

#include <iostream>
#include <iterator>
#include <sstream>
#include <vector>

int main()
{
std::string input = "1 23 45 6";
std::stringstream ss(input);
std::istream_iterator<double> end;
std::vector<double> output(std::istream_iterator<double>(ss), end);
}
3

Другие решения

В вашем коде тоже может быть что-то не так, чтобы объяснить каждый момент. Вот как бы я это сделал:

float v2;
std::istringstream iss("1 23 45 6");
while(iss >> v2) {
std::cout << v2 << std::endl;
}
1

Пошаговый анализ, чтобы учиться на ошибках:

Во-первых, нет функции-члена length() для массива символов, поэтому вы должны определить string m2="..."; для того, чтобы код для компиляции.

Тогда, к сожалению, ваш код будет печатать только один номер: последний. Зачем ? Потому что ваш printf() вне петли.

Как только вы поместите это в цикл, у вас будет много чисел, но больше, чем вы ожидаете:
* первая итерация начинается с «1 23 45 6» => 1
* вторая с «23 45 6» => 23
* третий итератон «23 45 6» => 23 снова!
* четвертая итерация «3 45 6» => 3 (вы ожидали этого?)

Так что вам придется переходить с одного номера на другой. Таким образом, вместо увеличения вы можете искать следующий пробел с помощью функции find_first_of():

for (int i = 0; i < m2.length(); i=m2.find_first_of(' ', i+1)) // jump to the next space
{
v2 = atof(&m2[i]);
printf("%.2f\n", v2);
}

Здесь онлайн демо.

Реальные альтернативы C ++:

Посмотри на πάντα ῥεῖ решение: так мы делаем в C ++

0

использование string вместо char*, чтобы сделать вещи немного проще.

Для преобразования данной строки в числовое значение используйте stringstream или же atof(),

Быстрое решение вашей проблемы:

#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

int main()
{
vector<float> myFloats;
string m("1. 2.23 45 6456    72.8  46..");

// First of parse given string and separate char groups that serve as a number
// => only consider 0-9 and '.'
if(m.size() == 0)
return 1;

string charGroup;
for(int i=0; i<m.length(); i++)
{
if((isdigit(m.at(i)) || m.at(i) == '.'))
{
charGroup += m.at(i);
if(i == m.length() - 1 && !charGroup.empty())
{
// in case given group is a numerical value
myFloats.push_back((float) atof(charGroup.c_str()));

// prepare for next group
charGroup.clear();
}
}
else if(!charGroup.empty())
{
if(m.at(i) == ' ')
{
// in case given group is a numerical value
myFloats.push_back((float) atof(charGroup.c_str()));

// prepare for next group
charGroup.clear();
}
else charGroup.clear();
}
}

// Print float values here
if(!myFloats.empty())
{
cout << "Floats: ";
for(int i=0; i<myFloats.size(); i++)
cout << myFloats.at(i) << ", ";
}

getchar();
return 0;
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector