如何从C ++中的char *中获取浮点数?

时间:2010-08-18 21:35:30

标签: c++

我对C ++相对较新,来自幸福快乐的Python世界。

我决定编写一组函数来查找一组数字的均值,中位数,模式和范围。为了帮助计算中位数,我决定制作l2g(最小到最大)和g2l(最大到最小)。我知道我只会使用其中一种,但是为了完整起见,我们想要制作两者。

我希望我的程序尽可能少依赖外部(甚至标准)库。这样做的原因是我很可能会使用我再写的任何函数。它们将在我基于BrokenThorn教程开发的操作系统中使用。因此,我希望使用我编写的函数而不是标准库中的函数来保持代码尽可能独立。

我有两个问题:

  • 首先,我希望我的函数能够处理浮点值。使用我之前创建的用户输入函数,我得到一个指向char数组的指针。我需要知道如何将其转换为浮点值。我想也许我可以用char和float类型的两个成员创建一个联合,并在我需要使用该值时引用float成员。我只是将用户数据放入char成员。但是,我不知道这种方法是否有效。我使用的教程并不是非常深入地定义我自己的数据类型。
  • 我的第二个困境是我不知道如何创建l2g和g2l函数。我正计划将两个for循环嵌套。我打算使用内部的数字来查找新数组中的下一个数字,然后使用外部数字重复此过程,直到它遍历原始数组中的所有数字。然后,在删除第一个数组的动态内存后,该函数将返回指向新浮点数组的指针。

另一个问题是,当我返回指向它的指针时,我认为我需要返回数组的长度。这样做的原因是使用for循环来遍历该数组的内容,我需要在数组中使用最高位置,所以我不会得到垃圾。我有办法通过制作一个有两个成员,长度和数组的结构来避免这个问题。它看起来像这样:

struct arrayLength {
    int l;
    float * p;
} ;

我希望以下一组电话:

float * myArrayPointer; // I will change this to user input once I get the rest of the program working
myArrayPointer = new float[5];
myArrayPointer[0] = 65.97;
myArrayPointer[1] = 21.06;
myArrayPointer[2] = 21.06;
myArrayPointer[3] = 509.69;
myArrayPointer[4] = -41.73; // Can floats be negative?
cout << mean(myArrayPointer, 5); // Give function mean the pointer to array and number of elements
cout << "\n";
cout << median(myArrayPointer, 5);
cout << "\n";
cout << range(myArrayPointer, 5);
cout << "\n";
cout << mode(myArrayPointer, 5);
cout << "\n\n\n";
arrayLength myArrayPointerLG = l2g(myArrayPointer, 5);
float * myArrayLGitem;
for(int i=0;i<myArrayPointerLG.l;i++) {
    myArrayLGitem = myArrayPointerLG.p[i];
    cout << myArrayPointerLGitem << "\n";
}

将提供以下输出:

115.21
21.06
551.42
21.06

-41.73
21.06
21.06
65.97
509.69

到目前为止,我还没有编译我的代码。 :/我想也许for循环有自己的范围......有人也可以验证这个吗?这是一个指向pastebin代码的链接:

  

Pastebin

如果你想知道<iostream>包含......我将删除它并使用我写的打印功能,如果我最终添加到我的操作系统。或者我可能只定义std :: cout。我得到的错误是在l2g中声明currentPosition和listOfNumbers未声明(未定义)。我使用MSVC ++ 2008 Express Edition编译器运行Windows 7 64位。提前感谢任何帮助过的人!

2 个答案:

答案 0 :(得分:6)

a)学习使用STL容器,算法等 他们会让你的生活更轻松

b)c func atof将执行问题标题要求

答案 1 :(得分:1)

如果解除对使用库的限制,这两项任务都非常简单。

使用Boost.lexical_cast(参见http://www.boost.org/doc/libs/1_43_0/libs/conversion/lexical_cast.htm)可以轻松地将char *转换为float。它提供任意两种类型之间的类型安全转换,只要它们定义“流”运算符(&lt;&lt;&gt;&gt;)。

#include "boost/lexical_cast.hpp"
...
const char* string_value = "1.5";
float float_value = boost::lexical_cast<float>(string_value);

标准库的排序方法是订购数组的最简单方法。使用上面的示例:

float * myArrayPointer;
myArrayPointer = new float[5];
myArrayPointer[0] = 65.97;
myArrayPointer[1] = 21.06;
myArrayPointer[2] = 21.06;
myArrayPointer[3] = 509.69;
myArrayPointer[4] = -41.73; // Can floats be negative?
std::sort(myArrayPointer, myArrayPointer+5); //Sort lowest to highest
std::sort(myArrayPointer, myArrayPointer+5, std::greater<float>()); //Sort highest to lowest

如果您坚持在没有任何图书馆帮助的情况下进行此操作,则必须为自己实施排序算法。有很多可供选择,每个都给你不同的性能特征。选择最符合您用例的那个。有关许多选项,请参阅http://en.wikipedia.org/wiki/Sorting_algorithm。 Quicksort和Merge-sort是相当常见的,可以提供相当好的性能。

至于手动实现char *浮动转换,你基本上就是自己实现C语言。为此,您需要遍历字符串中的每个字符,将其转换为相应的整数值,并将它们累积到浮点数中。然后,您可以使用小数点的位置来确定如何缩放所有值。例如,要将字符串“12.5”转换为浮点数,您必须将每个字符(“1”,“2”和“5”)转换为各自的整数,并将它们缩放为1 * 10 ^ 1 + 2 * 10 ^ 0 + 5 * 10 ^ -1。可能有更有效的方法来做到这一点,但这就像我能做到的那样简单。