2009-11-07 145 views
1

我想将字符串转换为双精度值。代码非常简单。将字符串转换为双精度的C++错误

  double first, second; 
      first=atof(str_quan.c_str()); 
      second=atof(extra[i+1].c_str()); 
      cout<<first<<" "<<second<<endl; 
      quantity=first/second; 

试图转换额外时,编译器会引发智慧这个宝石我:

error: request for member c_str in extra.std::basic_string<_CharT, _Traits, _Alloc>::operator[] [with _CharT = char, _Traits = std::char_traits, _Alloc = std::allocator](((unsigned int)(i + 1))), which is of non-class type char

我不知道这意味着什么。如果我cout额外的[i + 1],我得到3.如果我留下额外的字符串,程序试图首先(2)51(ascii为3)。到底他妈发生了什么?

+8

我的猜测是:额外的是一个字符串,'额外的[I + 1]'如果你想转换字符串的一部分,你可以做'atof(extra.c_str()[i + 1])' – UncleBens 2009-11-07 23:29:45

+4

这是一个字符,并且字符没有'c_str'方法。代码不完整 - 你错过了“extra”的定义。 – 2009-11-07 23:31:48

+0

刚试过。 错误:从const char到const char的无效转换* 错误:初始化double atof的参数1(const char *) – piratebill 2009-11-07 23:32:11

回答

6

听起来像extrastd::string,所以extra[i+1]返回一个char,它是非类的类型。

这听起来像你试图解析从i+1 th位置开始的字符串extra。您可以通过这样做:

second = atof(extra.substr(i + 1).c_str()); 
+1

这工作完美!谢谢。我一直在这里一个多小时。 – piratebill 2009-11-07 23:34:53

+0

Alternativly:'extra.c_str()+(i + 1)'避免了创建一个临时字符串对象 – sellibitze 2009-11-08 13:23:39

1

基于错误信息,extrastd::string型。当您执行extra[i+1]时,结果为char,并包含位于字符串extrai+1位置的字符。

可能不是你想要的。

作为一个解决方法,用新串代替extra[i+1],如下所示:

extra2 = extra.substr(i+1); 
// ... 
second=atof(extra2.c_str()); 

一种更好的方式来处理这种转换(这是不容易出错)是使用stringstreams:

stringstream ss(str_quan); 
double first; 
ss >> first; 
0

寻求帮助时,提供一个可编辑的例子通常是非常有用的。

我的猜测(和我强调的猜测,因为没有足够的类型信息或行号)。

second=atof(extra[i+1].c_str()); 

// Guess 
// extra is std::string. 

因此额外[X]正在恢复它没有一种方法c_str一个char()

1

你还没有说,但我觉得“多余”的类型的std ::的字符串。所以表达式“额外的[I + 1]是字符‘I + 1’的‘多余’,这似乎是‘3’。

什么是你真正想干什么?

如果你只是想字符I + 1通过在2002年底的“额外”(你知道是额外多长时间),你想要的东西,如:

second = atof(extra.c_str() + i + 1); 
+0

为了这个目的,最好使用'substr',因为如果'i + 1会抛出'std :: out_of_range' '超过了字符串的末尾。 – 2009-11-07 23:40:31

+0

以临时代价为代价;这就是为什么我说“你知道额外多久”。但是,我明白你的观点;另一种方法是在调用atof()之前“assert(i + 1 janm 2009-11-08 00:15:47

相关问题