strtod在同一变量上没有给出一致的结果? 我学习C++,并通过一些例题练习。特别是,这个函数接受命令行参数,然后对它们进行数学运算,如果我输入 ./ex1 sum 1.0 2.0 3.0
它应该把数字加起来。我的代码是这样的:strtod在同一变量上没有给出一致的结果? 我学习C++,并通过一些例题练习。特别是,这个函数接受命令行参数,然后对它们进行数学运算,如果我输入 ./ex1 sum 1.0 2.0 3.0,c++,string,double,C++,String,Double,它应该把数字加起来。我的代码是这样的: int main(int argc, char* argv[]) { double print_val; //if we want a sum print_val = sum(argc, argv); cout << print_val << endl; } intmain(intargc,char*argv[]) { 双重打印; //如果我们想要一笔钱 打印值=总和(argc,argv); 库特
int main(int argc, char* argv[])
{
double print_val;
//if we want a sum
print_val = sum(argc, argv);
cout << print_val << endl;
}
intmain(intargc,char*argv[])
{
双重打印;
//如果我们想要一笔钱
打印值=总和(argc,argv);
库特
这将argv[i]
转换为double
,并将指向字符串其余部分的指针存储在argv[i]
中。在您的情况下,它将是一个空字符串,因为整个字符串都用于转换
这意味着您只能用i
的每个值调用此函数一次。如果调试代码的某些部分以这种方式进行调用,那么以后所有使用相同i
的调用都将尝试从空字符串中提取double
,并失败
不需要这样做,只需为第二个参数传递一个空指针:
strtod(argv[i], nullptr) // C++11
strtod(argv[i], NULL) // pre-C++11
我曾经做过这样的改变
请注意,这不会处理错误情况,例如,argv[i]
根本无法转换时。要检测这种情况,您可以:
- 将局部变量的地址作为第二个参数传递给strod
:
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_参数
异常argv[i]
转换为double
,并将指向字符串其余部分的指针存储在argv[i]
中。在您的情况下,它将是一个空字符串,因为整个字符串都用于转换
这意味着您只能用i
的每个值调用此函数一次。如果调试代码的某些部分以这种方式进行调用,那么以后所有使用相同i
的调用都将尝试从空字符串中提取double
,并失败
不需要这样做,只需为第二个参数传递一个空指针:
strtod(argv[i], nullptr) // C++11
strtod(argv[i], NULL) // pre-C++11
我曾经做过这样的改变
请注意,这不会处理错误情况,例如,
argv[i]
根本无法转换时。要检测这种情况,您可以:
- 将局部变量的地址作为第二个参数传递给strod:
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... }
- 使用
(对于C++11或更高版本),如果无法执行转换,则会抛出std::stod
异常std::invalid_参数
argv[i]
转换为double
,并将指向字符串其余部分的指针存储在argv[i]
中。在您的情况下,它将是一个空字符串,因为整个字符串都用于转换
这意味着您只能用i
的每个值调用此函数一次。如果调试代码的某些部分以这种方式进行调用,那么以后所有使用相同i
的调用都将尝试从空字符串中提取double
,并失败
不需要这样做,只需为第二个参数传递一个空指针:
strtod(argv[i], nullptr) // C++11
strtod(argv[i], NULL) // pre-C++11
我曾经做过这样的改变
请注意,这不会处理错误情况,例如,
argv[i]
根本无法转换时。要检测这种情况,您可以:
- 将局部变量的地址作为第二个参数传递给strod:
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... }
- 使用
(对于C++11或更高版本),如果无法执行转换,则会抛出std::stod
异常std::invalid_参数
argv[i]
转换为double
,并将指向字符串其余部分的指针存储在argv[i]
中。在您的情况下,它将是一个空字符串,因为整个字符串都用于转换
这意味着您只能用i
的每个值调用此函数一次。如果调试代码的某些部分以这种方式进行调用,那么以后所有使用相同i
的调用都将尝试从空字符串中提取double
,并失败
不需要这样做,只需为第二个参数传递一个空指针:
strtod(argv[i], nullptr) // C++11
strtod(argv[i], NULL) // pre-C++11
我曾经做过这样的改变
请注意,这不会处理错误情况,例如,
argv[i]
根本无法转换时。要检测这种情况,您可以:
- 将局部变量的地址作为第二个参数传递给strod:
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... }
- 使用
(对于C++11或更高版本),如果无法执行转换,则会抛出std::stod
异常std::invalid_参数
strtod(argv[i],&argv[i])
时要修改argv[i]
?您应该只为第二个参数传递NULL,即strtod(argv[i],NULL)
。您有很好的机会修复这个古老的C错误。将函数声明更改为double sum(int argc,const char*argv[])编译器会告诉你你做错了什么。如果它在main中工作,很可能你没有将正确的参数传递给新函数。stod
有什么问题请确保你问题中的代码反映了你的实际代码,否则会让人困惑。你为什么要修改argv[i]
在调用strtod(argv[i],&argv[i])
时,您应该只为第二个参数传递NULL,即strtod(argv[i],NULL)
。您有很好的机会修复这个古老的C错误。将函数声明更改为双和(int-argc,const-char*argv[])编译器会告诉你做错了什么。如果它在main中工作,很可能你没有将正确的参数传递给新函数。stod
有什么问题请确保你问题中的代码反映了你的实际代码,否则会让人困惑。