这段代码有什么问题?我需要将字符串转换为float

时间:2015-04-25 11:24:07

标签: c++ atof type-conversion

这段代码有什么问题?我需要将字符串转换为float。 m2在 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; 
}

4 个答案:

答案 0 :(得分:3)

  

我需要转换数组中的每个元素,以便我可以存储它们来进行操作

那么你如何使用字符串流将字符串中的数字提取到矢量中呢?

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

答案 1 :(得分:1)

您的代码也可能出现问题,无法解释每一点。那是我怎么做的:

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

答案 2 :(得分:0)

逐步分析,从错误中学习:

首先,对于一个字符数组,没有成员函数length(),因此您应该定义string m2="...";以便编译代码。

然后很遗憾,您的代码只打印一个数字:最后一个。为什么?因为您的printf()不在循环中。

一旦你把它放在循环中,你就会有很多数字,但比你预期的要多:
 *第一次迭代,它以“1 23 45 6”开始=&gt; 1
 *第二个用“23 45 6”=&gt; 23个
 *第三个iteraton“23 45 6”=&gt;再次23!
 *第四次迭代“3 45 6”=&gt; 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);
}

这里是online demo

真正的c ++替代方案:

看看πάνταῥεῖ的解决方案:这就是我们用C ++做的方式

答案 3 :(得分:0)

使用string代替char*,让事情变得更轻松。

要将给定字符串转换为数字值,请使用stringstreamatof()

快速解决您的问题:

#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; 
}