Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 像阿托伊一样,只是漂浮着_C++_Casting_Atoi - Fatal编程技术网

C++ 像阿托伊一样,只是漂浮着

C++ 像阿托伊一样,只是漂浮着,c++,casting,atoi,C++,Casting,Atoi,有没有类似于atoi的函数,可以将字符串转换为浮点而不是整数? (或说C++ +谢谢)代码> 双原子(常数字符*); 还有strtodstrtof 从手册页 strtod()、strtof()和strtold()函数分别将nptr指向的字符串的初始部分转换为double、float和long double表示形式 字符串(初始部分)的预期形式是可选的前导空格,由isspace(3)识别,可选的加号(“”+“”)或减号(“”-“”),然后是(i)十进制数,或(ii)十六进制数,或(iii)无穷大

有没有类似于atoi的函数,可以将字符串转换为浮点而不是整数?

(或说C++ +谢谢)

代码> 双原子(常数字符*); 还有
strtod

strtof

从手册页

strtod()、strtof()和strtold()函数分别将nptr指向的字符串的初始部分转换为double、float和long double表示形式

字符串(初始部分)的预期形式是可选的前导空格,由isspace(3)识别,可选的加号(“”+“”)或减号(“”-“”),然后是(i)十进制数,或(ii)十六进制数,或(iii)无穷大,或(iv)NAN(非数字)

/手册页>


atof将字符串转换为双精度(而不是其名称所表示的浮点)。

使用
atof
from
stdlib.h

double atof ( const char * str );
首选
strof()
atof()
不检测错误。

boost::lexical_cast(str);
boost::lexical_cast<float>(str);

这个模板函数包含在流行的库集合中,如果你认真对待C++,你会想了解的。

将字符串转换成任何类型(默认构造和可流):

模板
T从字符串转换字符串(const std::string&str)
{
标准:istringstream iss(str);
T结果;
如果(!(iss>>结果))抛出“伙计,你需要错误处理!”;
返回结果;
}

作为已提到的<代码> STD::Struts()/<代码>和>()/<代码>,新的C++标准引入

float stof(const string& str, size_t *idx = 0);
double stod(const string& str, size_t *idx = 0);
long double stold(const string& str, size_t *idx = 0);
用于检查字符串到浮点转换时出错。GCC和MSVC都支持它们(记住要包含它们)

这也可以(但C类代码除外):

#包括
使用名称空间std;
int main()
{
float myFloatNumber=0;
字符串inputString=“23.2445”;
sscanf(inputString.c_str(),%f“,&myFloatNumber);

cout作为上述内容的替代,您可以使用字符串流。

试试boost::spirit:速度快,打字安全,效率高:

std::string::iterator begin = input.begin();
std::string::iterator end = input.end();
using boost::spirit::float_;

float val;
boost::spirit::qi::parse(begin,end,float_,val);


atof和strtod都转换为双精度而不是浮点。@Glen:和
atoi
转换为
long
,那又怎么样?@Glen:你真的想要那三页解释为什么没有atof\u浮点()?atof()是解决等效于atoi问题的正确答案。问题不是:“还有其他函数可以从字符串转换为数字类型吗?”。
boost::lexical_cast
strof
都是比
atof
好得多的解决方案,因为
atof
没有错误检测。@Glen,@RED:这个问题确实是关于“float”(而不是
float
)的,与它提到“integer”的方式相同(不是
int
),因此使用
double
的答案应该是好的,这个答案仍然不好,因为所有
atox()
函数有一个内置的缺陷,即错误字符串返回有效值。对于一个已经很糟糕的API函数来说。
如果无法执行转换,则返回0.0。
为什么会有人使用一个错误返回0.0的愚蠢函数?0.0可能是一个有效值,与垃圾输入无法区分。ID我一点也不喜欢这样。事实上,我更喜欢字符串流,除非你知道你有性能问题。不过,
+1
来自我,因为
atox()
函数家族在其接口中内置了一个致命缺陷是正确和重要的。你能提供一个关于使用atof()问题的链接吗?我使用它已经20年了-我记不起它有任何问题。
manatof
:函数
atof()
将nptr指向的字符串的初始部分转换为double。其行为与
strod(nptr,(char**)NULL);
相同,只是
atof()
没有检测到错误。噢,windows程序员,这就解释了,哈哈。
atof()
没有检测到解析错误。如果字符串在解析和转换之间损坏,请尝试
std::cout
atof()
不会注意到。这需要下载并安装boost(apx.500 MB)您应该注意,C++中的新手会被混淆。在我的系统中,这需要一个简单的<代码> SUDO APT获得LIPBOOST DEV/<代码>,也许我会在慢互联网链接上等待一分钟。SBI,我基本上同意,但是一些聪明的、有天赋的开发者可能因为许多原因而无法获得提升(政治是一个大的)。.这不是一个很好的情况,但是把他们说成“不值他们的钱”有点苛刻。哦,老兄,我这么多年来一直在使用boost。我一次又一次地被这样一个简单的问题所打动,它会引发这样的“宗教”问题"冲突。@格林:是的,你说的对,讨厌的公司政策总是不作为使用Boost的理由。我道歉,这确实有点苛刻。我删除了我的评论。这可能是一个C问题而不是C++。AtOI是C标准库的一部分。@ Red SuffAd::代码> ATOI < /C> >完全可以用C++。这与ST不冲突。AdTeI我做了。@ Red:OP把这个标记为C++,我只是假设他们知道他们需要什么。谢谢C++唯一的解决方案!所有其他答案都是C语言,但是问题是加标签C++。(或者正确地说,在空格的情况下)。我确信
lexical\u cast()
得到了这个(以及更多)全部涵盖。@Kenji:首先,抛出字符串文字肯定会让人下地狱——在回答一个新手问题时这样做很可能会让无辜者下地狱。此外,此代码不会检查字符串中是否还有未使用的非空白字符,这很可能是一个错误。当问题是关于浮点时,答案是正确的转换几乎任何可流化的内容,因此
float stof(const string& str, size_t *idx = 0);
double stod(const string& str, size_t *idx = 0);
long double stold(const string& str, size_t *idx = 0);
#include <iostream>

using namespace std;

int main()
{
float myFloatNumber = 0;
string inputString = "23.2445";
sscanf(inputString.c_str(), "%f", &myFloatNumber);
cout<< myFloatNumber * 100;

}
std::string::iterator begin = input.begin();
std::string::iterator end = input.end();
using boost::spirit::float_;

float val;
boost::spirit::qi::parse(begin,end,float_,val);