将字符数组转换为浮点数?

4

我正在编写一个非常基本的命令行C++应用程序,它在执行时需要参数。

我今天刚开始学习C ++,很明显,您只能将 char **作为参数的数据类型。我想将两个float作为参数传递(稍后将它们相加),但似乎无法将字符数组转换为浮点数。

我尝试了使用 static_cast<float>(argv[0])stof(argv[0]) 转换这些值,但两者都会导致编译错误(无法转换和未定义,分别)。

如果有任何问题,我正在使用 Code::Blocks IDE

我的代码:

#include <iostream>
#include <string>

/**
 * author: 2mac
 *
 */

using namespace std;

void derp();
float getSum(float num1, float num2);

int main(int argc, char** argv)
{
    float num1 = static_cast<float>(argv[0]);
    float num2 = static_cast<float>(argv[1]);

    if (argc != 0 || argc != 2)
        cout << "Usage: hello-world [args]\nargs: none OR <num1> <num2> to be added together" << endl;
    else
    {
        switch (argc)
        {
        case 0:
            derp();
            break;
        case 2:
            derp();
            cout << num1 << " + " << num2 << " equals " << getSum(num1,num2) << endl;
            break;
        }
    }
    return 0;
}

void derp()
{
    cout << "Hello, world!\n";
    cout << "It's time to lern some C++!" << endl;
}

float getSum(float num1, float num2)
{
    return num1 + num2;
}

argv[0] 将是您的程序名称。使用 argv[1] 作为第一个参数,argv[2] 作为第二个参数,以此类推。但是,每当您使用 argv[1...n] 时,都应该检查 argc 是否足够大。它始终至少有一个值(程序名称始终在 argv[0] 中),并且每个命令行参数都会增加 1。因此,您的检查应该是关于 argc == 1 或 3,而不是 0 和 2。您的检查似乎也是不正确的。!= 与 or。 - Scooter
3个回答

4
使用此方法将您的输入转换为浮点数:
double f1, f2;
if (argc == 2)
{
    f1 = atof (argv[0]);
    f2 = atof (argv[1]);
}

编译器对此给我带来了烦恼。与以前类似,atof不在范围内定义。 - 2mac
1
你需要 **#include <stdlib.h>**。 - Deidrei
2
如果你是在使用 C++,不要使用 stdlib.h。请改用 cstdlib - Sinkingpoint

1
在C++中,char**只是指向字符指针的指针,因此不能直接转换为float(或任何数字值)。因此,您的第一个示例将失败。您可以使用中间函数atofstrtof(请注意strtof,而不是stof,这就是为什么第二个示例失败的原因)来转换这些值,假设您确定它们实际上是以float形式存在的。

好的。我已经修改了代码,使用strtof代替,但是在编译时仍然出现了error: 'strtof' was not declared in this scope的错误信息。 - 2mac

1
你只是通过类型转换将 char * 变量转换为 float。这将把指针的值转换为浮点数,而不是将字符串转换为浮点数。
你需要使用 atofstrtof 等函数将字符串转换为浮点数。或者你可以编写自己的函数来将字符串转换为浮点数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接