将字符串转换为双精度的 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】:

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

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

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

【讨论】:

这很完美!谢谢你。我已经在这里待了一个多小时。 Alternativly: extra.c_str()+(i+1) 避免创建临时字符串对象【参考方案2】:

根据错误消息,extra 的类型为 std::string。当您执行extra[i+1] 时,结果为char 类型并包含字符串extrai+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++ 错误的主要内容,如果未能解决你的问题,请参考以下文章

C++ 将字符串转换为双精度

如何使用 stringstream 在 C++ 中将字符串转换为双精度值 [关闭]

在 C++ 中将字符串转换为双精度

如何在 C++ 中将字符串转换为双精度值?

将字符串转换为双精度,[重复]

将字符串从组合框转换为双精度