atof和非null终止的字符数组

tez*_*tez 3 c c++ atof

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";
    }
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT: 5YES

atof也可以使用非null终止的字符数组吗?如果是这样,它怎么知道停在哪里?

And*_*owl 5

atof也可以使用非null终止的字符数组吗?

不,它没有.std::atof在输入中需要以null结尾的字符串.未满足此前提条件的是未定义行为.

未定义的行为意味着任何事情都可能发生,包括程序似乎工作正常.这里发生的事情很可能是你的数组的最后一个元素之后的内存中有一个字节,它不能被解释为浮点数表示的一部分,这就是你执行std::atof停止的原因.但那是不可靠的.

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

char c[] = {'0', '.', '5', '\0'};
//                         ^^^^
Run Code Online (Sandbox Code Playgroud)

  • @jrok:但是没有*要求*它在遇到不属于浮点数的字符时停止.这只是一个实施质量问题.一个糟糕的"atof"解释肯定允许在其输入上调用`strlen`,即使这可能使它在某些情况下慢1000倍. (2认同)