为什么此函数不按需打印所有char数组?

时间:2019-05-01 10:48:00

标签: c++

我正在尝试从char数组转换为整数,并且atoi函数正常运行,除非当我在第一个索引中添加零时...没有打印出来

#include<iostream>

using namespace std;

int main()
{
    char arr[]= "0150234";
    int num;
    num=atoi(arr);
    cout << num;
    return 0;
}

我希望输出0150234,但实际输出是150234

3 个答案:

答案 0 :(得分:2)

我认为在atoi函数中,您已将字符串类型转换为整数,因此删除了0。您永远都不会在数字前打印0,因为这没有意义。 000001将始终表示为1。 我希望这可以消除您的疑问。

答案 1 :(得分:1)

二进制数表示形式(例如int)不存储前导0,因为它们的数量是无限的。而是存储固定数量的位,其中可能有一些前导0位。

如有必要,您仍然可以打印前导0:

std::cout << std::setw(4) << std::setfill('0') << 1 << '\n';

输出:

0001

答案 2 :(得分:0)

您混淆了两个想法:

数字:这些是抽象的东西。它们是数量。您的计算机以您不关心的方式存储数字(尽管它可能是二进制的)。

表示形式:这些是我们向人类显示数字的方式,例如“ 150234” “ 0x24ADA” “十五万,二十三十四” 。当您转换为字符串时,可以选择一种表示形式。当流传输到std::cout时,默认情况下会为您选择一个表示形式,但是您可以使用I / O操纵器选择自己的表示形式,例如Maxim shows

变量num数字,而不是数字的表示。它不包含信息«将此显示为“ 0150234”»。这就是arr提供的内容,因为它是一个包含数字表示形式的字符串。因此,如果原始表示形式中的前导零对您很重要,那么在打印num时,您必须自己复制该表示形式。


顺便说一句...

通常,在编程世界中,尤其是在类似C的源代码中:

  • 当我们看到类似“ 150234” 的字符串时,我们假定它是数字的十进制(基数为10);
  • 当我们看到类似“ 0x24ADA” 的字符串(带有前导0x)时,我们假定它是数字的十六进制(基数为16);
  • 当我们看到类似“ 0150234” 的字符串(带有前导0)时,我们假定它是数字的八进制(基数为8)。

因此,如果您添加前导零,则可能会使用户感到困惑。

仅供参考,您电话号码的传统8进制表示为“ 0445332”