strtod 在同一变量上没有给出一致的结果
strtod not giving consistent results on same variable?
我正在学习 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 正在通过返回双精度
cout << strtod()
and
cout << strtod() + 1.0
它们都会产生预期的结果,但如果在 for 循环中我放入
cout << return_val
每次分配后,它显示为 0。我什至尝试将其初始化为 return_val
到 1.0 无济于事(每次同一行输出 1(。
我最初在主中拥有此代码,并且它有效。我将其复制/粘贴到此功能中,现在它不起作用。我做错了什么?
完整的文件,就像它目前一样(有很多调试功能((对不起,缩进很不稳定,我也是第一次学习 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
进行此更改后,我得到了正确的输出。
请注意,这不会处理错误情况,例如根本无法转换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 != ' ' instead for whether the entire string is converted if(optr == argv[i]) { // Handle failure... }
使用
std::stod
(适用于 C++11 或更高版本(,如果无法执行转换,则会引发std::invalid_argument
异常。
相关文章:
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- C++ SSE 内部函数:将结果存储在变量中
- 按值传递变量与按引用传递变量具有相同的结果
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 调用一个小函数两次(例如在if条件和主体中)比将结果存储在局部变量中更可取
- 为什么使用 SPI 时,全局缓冲区变量产生的结果与局部缓冲区变量不同
- 带有大结构变量的 CUDA 内核函数给出了错误的结果
- 如果我将索引变量更改为零,并且合并函数中的k = 0,则获得合并排序的错误结果
- 整数变量与整数字面变化的乘法结果
- 如果结果存储在变量中forward_as_tuple然后在 std::apply 中使用之前丢失右值引用
- 使用变量和常量的结果在 c++ 中并不相同
- 是否可以将类成员变量设置为类函数的结果?
- 为什么总和变量的结果= 1
- 对条件表达式结果的赋值(其中第二个和第三个操作数是相同类型和值类别的变量)是否仍然存在?
- 如何使变量始终等于某些计算的结果
- 当变量的顺序发生变化时C++双倍乘法会产生不同的结果
- TLS变量访问的结果未缓存
- 用名称为“ this”内部括号内的变量在3个不同的编译器上导致不同的结果
- 从返回类型的函数中获取结果'void'而结果变量是输入参数之一 - C++