将字符串转换为双精度的 C++ 错误
Posted
技术标签:
【中文标题】将字符串转换为双精度的 C++ 错误【英文标题】:C++ error converting a string to a double 【发布时间】:2010-12-14 06:24:38 【问题描述】:我正在尝试将字符串转换为双精度。代码非常简单。
double first, second;
first=atof(str_quan.c_str());
second=atof(extra[i+1].c_str());
cout<<first<<" "<<second<<endl;
quantity=first/second;
当尝试进行额外转换时,编译器会向我抛出这个智慧宝石:
错误:对成员 c_str 的请求 extra.std::basic_string<_chart _traits _alloc>::operator[] [with _CharT = char, _Traits = std::char_traits, _Alloc = std::allocator](((无符号 int)(i + 1))),它是非类的 输入字符
我不知道那是什么意思。如果我 cout extra[i+1],我会得到 3。如果我将 extra 作为字符串保留,程序会尝试首先将 (2) div 除以 51(ascii 表示 3)。到底是怎么回事?
【问题讨论】:
我的猜测是:extra 是一个字符串,extra[i + 1]
是一个字符,而字符没有c_str
方法。如果你想转换部分字符串,你可以做类似atof(extra.c_str()[i + 1])
该代码不完整 - 您缺少“额外”的定义。
刚刚试过。错误:从 const char 到 const char* 的无效转换错误:初始化 double atof(const char*) 的参数 1
@UncleBens - 将正确答案作为评论的无私行为 +1
代码完整,只是我没有全部贴出来。如果您认为这会有所帮助,我可以。
【参考方案1】:
听起来extra
是std::string
,所以extra[i+1]
返回一个char
,它是非类类型。
听起来您正试图从i+1
th 位置开始解析字符串extra
。你可以这样做:
second = atof(extra.substr(i + 1).c_str());
【讨论】:
这很完美!谢谢你。我已经在这里待了一个多小时。 Alternativly:extra.c_str()+(i+1)
避免创建临时字符串对象【参考方案2】:
根据错误消息,extra
的类型为 std::string
。当您执行extra[i+1]
时,结果为char
类型并包含字符串extra
i+1
位置中的字符。
可能不是你想要的。
作为修复,将extra[i+1]
替换为新字符串,如下所示:
extra2 = extra.substr(i+1);
// ...
second=atof(extra2.c_str());
处理这种转换(不太容易出错)的更好方法是使用字符串流:
stringstream ss(str_quan);
double first;
ss >> first;
【讨论】:
【参考方案3】:你还没有说,但我认为“额外”是 std::string 类型。所以表达式“extra[i+1]”是“extra”的字符“i+1”,好像是'3'。
你实际上想做什么?
如果您只希望字符 i+1 一直到“extra”的末尾(并且您知道 extra 有多长),您需要类似:
second = atof(extra.c_str() + i + 1);
【讨论】:
最好使用substr
来达到这个目的,因为如果i + 1
超过了字符串的末尾,它会抛出std::out_of_range
。
以临时为代价;这就是为什么我说“你知道额外的时间有多长”。但是,我同意你的观点;在调用 atof() 之前,另一种选择是“assert(i + 1
【参考方案4】:
在寻求帮助时,提供一个可编译的示例通常是非常有用的。
我的猜测(我强调猜测,因为没有足够的类型信息或行号)。
second=atof(extra[i+1].c_str());
// Guess
// extra is std::string.
因此 extra[x] 返回一个没有方法 c_str() 的字符
【讨论】:
以上是关于将字符串转换为双精度的 C++ 错误的主要内容,如果未能解决你的问题,请参考以下文章