gpt4 book ai didi

c++ - strtod 在同一变量上没有给出一致的结果?

转载 作者:行者123 更新时间:2023-11-28 00:24:27 27 4
gpt4 key购买 nike

我正在学习 C++,并且正在完成一些示例练习。特别是这个接受命令行参数,然后对它们进行数学运算,这样如果我输入

./ex1 sum 1.0 2.0 3.0

它应该对数字求和。我的代码是这样的:

int main(int argc, char* argv[])
{
double print_val;
//if we want a sum
print_val = sum(argc, argv);
cout << print_val << endl;
}

然后,后来,我有

double sum(int argc, char* argv[]){
double return_val = 0;
for(int i =2; i< argc; i++){
return_val += strtod(argv[i], &argv[i]);
}
return return_val;
}

但出于某种原因,我只得到 0。当我进行调试时,我可以看到 strtod 通过

返回一个 double 值
cout << strtod()
and
cout << strtod() + 1.0

它们都产生了预期的结果,但是如果我在 for 循环中输入

cout << return_val

每次赋值给它之后,结果都是 0。我什至尝试将它初始化为 return_val 到 1.0,但无济于事(同一行每次输出 1)。

我最初在 main 中有这段代码,并且它有效。我将它复制/粘贴到此函数,但现在不起作用。我做错了什么?

完整文件,目前的样子(有很多调试功能)(抱歉缩进不靠谱,我也是第一次学习 vim,它在 vim 中看起来不错):http://paste.ubuntu.com/8320413

最佳答案

strtod(argv[i], &argv[i])

这会将 argv[i] 转换为 double 并将指向字符串其余部分的指针存储在 argv[i] 中。在您的情况下,它将是一个空字符串,因为整个字符串都用于转换。

这意味着您只能对 i 的每个值调用一次。如果您的调试代码的某些部分以这种方式进行调用,那么以后所有使用相同 i 的调用都将尝试从空字符串中提取 double 并失败。

不需要这个,只需要为第二个参数传递一个空指针:

strtod(argv[i], nullptr) // C++11
strtod(argv[i], NULL) // pre-C++11

get the correct output一旦我做了这个改变。


请注意,这不会处理错误情况,例如 argv[i] 根本无法转换。要检测到这一点,您可以:

  • 将局部变量的地址作为第二个参数传递给strtod:

    char *optr;
    double result = strtod(argv[i], &optr);

    // This checks if at least some part of the string has been converted
    // Check *optr != '\0' instead for whether the entire string is converted
    if(optr == argv[i]) {
    // Handle failure...
    }
  • 使用 std::stod(适用于 C++11 或更高版本),如果无法执行转换,则会抛出 std::invalid_argument 异常。

关于c++ - strtod 在同一变量上没有给出一致的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25793264/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com