首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >atof和非null终止的字符数组

atof和非null终止的字符数组
EN

Stack Overflow用户
提问于 2013-03-22 20:19:33
回答 7查看 2.5K关注 0票数 3
代码语言:javascript
复制
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是否也适用于非空终止的字符数组?如果是这样,它如何知道在哪里停止?

EN

回答 7

Stack Overflow用户

发布于 2013-03-22 20:21:13

也可以处理非空终止的字符数组吗?

不,它不是。std::atof要求输入中包含以null结尾的字符串。未能满足此前提条件的是未定义的行为

未定义的行为意味着任何事情都可能发生,包括看起来运行良好的程序。这里发生的情况是,内存中恰好在数组的最后一个元素之后有一个字节,它不能被解释为浮点数表示的一部分,这就是为什么您的std::atof实现停止了。但这是不能依赖的。

你应该这样修复你的程序:

代码语言:javascript
复制
char c[] = {'0', '.', '5', '\0'};
//                         ^^^^
票数 5
EN

Stack Overflow用户

发布于 2013-03-22 20:21:38

不,atof不适用于非null终止的数组:只要在您传入的数组末尾之后发现零,它就会停止。在不终止的情况下传递数组是未定义的行为,因为它会导致函数读过数组的末尾。在您的示例中,该函数可能已经访问了您分配给f的字节(尽管不确定,因为f不需要在内存中跟随c[] )。

代码语言:javascript
复制
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,指出了一个事实,即读操作已经超过了数组的结尾。

票数 2
EN

Stack Overflow用户

发布于 2013-03-22 20:26:21

不..。atof()需要以null结尾的字符串。

如果需要转换的字符串不是以null结尾的字符串,可以尝试根据每个字符的值作为有效数字将其复制到目标缓冲区中。对……有影响的事情

代码语言:javascript
复制
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 );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15570154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档