转换/解析指针字符串和双精度

时间:2011-09-18 20:19:29

标签: c++ string pointers double

分配:

  1. 从文本文件中读取信息(完成)

  2. 使用substr方法(完成)

  3. 仅检索部分文本文件
  4. 将信息存储到实例变量中(需要帮助)

  5. 以下是我遇到问题的代码:

    string* lati;
    lati = new string(data.substr(0, data.find_first_of(",")));
    
    double* latDub;
    latDub = new double(atof((char *)lati));
    
    this->latitude = *latDub;
    
    1. 我需要将纬度存储到实例变量latitude中。

    2. 变量data是读入文本文件。

    3. this->latitude被声明为double

    4. 我已经过测试,变量lati是正确的值,但是一旦我尝试将其转换为double,由于某种原因,值会更改为0。我特意应该在转换时使用atof方法!

2 个答案:

答案 0 :(得分:2)

(char *)lati没有按照您的想法行事。你明显要做的是获得与lati相关联的char序列,但你实际做的只是将string*压缩到char*这是各种各样的坏。

std :: string上有一个成员函数,可以为您提供所需的内容。您应查看字符串的文档,并将(char *)lati替换为该函数的调用。

答案 1 :(得分:0)

为什么你的代码会编译,但是已经提供了无意义的结果explained by adpalumbo。导致该错误的代码中存在两个基本问题,我想在此处进行扩展。

一个是你使用C风格的演员:(T)obj。基本上,这只是告诉编译器关闭,你知道你在做什么。这很少是一个好主意,因为当你知道自己在做什么时,你通常可以不进行这样的演员表演。

另一个是您正在使用在堆上动态分配的对象。在C ++中,应该在堆栈上创建对象,除非您有充分的理由使用动态对象。动态对象通常隐藏在堆栈中的对象内。所以你的代码应该是这样的:

string lati(data.substr(0, data.find_first_of(",")));
double latDub = /* somehow create double from lati */;
this->latitude = latDub;

当然,latDub完全没必要,您也可以直接写入this->latitude

现在,将字符串转换为其他类型的常用方法是通过字符串流传输它。删除您引入的不必要的变量,您的代码将如下所示:

std::istringstream iss(data.substr(0, data.find_first_of(",")));
if( !iss >> this->latitude ) throw "Dude, you need error handling here!";

通常,您希望将该转换从字符串打包到实用程序函数中,您可以在整个代码中重复使用该函数:

inline double convert3double(const std::string& str)
{
  std::istringstream iss(str);
  double result;
  if( !iss >> result )
    throw std::exception("Dang!");
  return result;
}

但是,由于可以对所有类型使用相同的算法(operator>>有意义地将输入流作为左操作数重载),只需将其设为模板:

template< typename T >
inline T convert3double(const std::string& str)
{
  std::istringstream iss(str);
  T result;               // presumes default constructor
  if( !iss >> result )    // presumes operator>>
    throw std::exception("Dang!");
  return result;
}