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...
      }
      
    • 使用
      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...
      }
      
    • 使用
      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...
      }
      
    • 使用
      std::stod
      (对于C++11或更高版本),如果无法执行转换,则会抛出
      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
    有什么问题请确保你问题中的代码反映了你的实际代码,否则会让人困惑。