using namespace std;
int main(int argc, char *argv[]) {
char c[] = {'0','.','5'};
//char c[] = "0.5";
float f = atof(c);
cout << f*10;
if(c[3] != '\0')
{
cout << "YES";
}
}输出:5YES
atof是否也适用于非空终止的字符数组?如果是这样,它如何知道在哪里停止?
发布于 2013-03-22 20:21:13
也可以处理非空终止的字符数组吗?
不,它不是。std::atof要求输入中包含以null结尾的字符串。未能满足此前提条件的是未定义的行为。
未定义的行为意味着任何事情都可能发生,包括看起来运行良好的程序。这里发生的情况是,内存中恰好在数组的最后一个元素之后有一个字节,它不能被解释为浮点数表示的一部分,这就是为什么您的std::atof实现停止了。但这是不能依赖的。
你应该这样修复你的程序:
char c[] = {'0', '.', '5', '\0'};
// ^^^^发布于 2013-03-22 20:21:38
不,atof不适用于非null终止的数组:只要在您传入的数组末尾之后发现零,它就会停止。在不终止的情况下传递数组是未定义的行为,因为它会导致函数读过数组的末尾。在您的示例中,该函数可能已经访问了您分配给f的字节(尽管不确定,因为f不需要在内存中跟随c[] )。
char c[] = {'0','.','5'};
char d[] = {'6','7','8'};
float f = atof(c); // << Undefined behavior!!!
float g = atof(d); // << Undefined behavior!!!
cout << f*10;上面的prints 5.678,指出了一个事实,即读操作已经超过了数组的结尾。
发布于 2013-03-22 20:26:21
不..。atof()需要以null结尾的字符串。
如果需要转换的字符串不是以null结尾的字符串,可以尝试根据每个字符的值作为有效数字将其复制到目标缓冲区中。对……有影响的事情
char buff[64] = { 0 };
for( int i = 0; i < sizeof( buff )-1; i++ )
{
char input = input_string[i];
if( isdigit( input ) || input == '-' || input == '.' )
buff[i] = input;
else
break;
}
double result = atof( buff );https://stackoverflow.com/questions/15570154
复制相似问题