在C中存储前导零

在C中存储前导零,c,C,首先,我是编程新手 我想知道如何用scanf存储一个带前导零的数字,而不是修改printf。它与数据类型有关吗?如果是,是什么?我如何使用它?我目前只知道int、double和float 例如,我想输入数字“02”并接收“02”作为输出,当我输入“2”时,输出也将是“2”。如果您有一个int值,在内部它总是表示为一定数量的位(或CPU使用的任何位),因此您无法控制它 就内部格式而言,始终存在“前导零”,因为,例如,因为2099实际上是32位形式的0b00000000000001000001101

首先,我是编程新手

我想知道如何用scanf存储一个带前导零的数字,而不是修改printf。它与数据类型有关吗?如果是,是什么?我如何使用它?我目前只知道int、double和float


例如,我想输入数字“02”并接收“02”作为输出,当我输入“2”时,输出也将是“2”。

如果您有一个
int
值,在内部它总是表示为一定数量的位(或CPU使用的任何位),因此您无法控制它

就内部格式而言,始终存在“前导零”,因为,例如,因为2099实际上是32位形式的
0b000000000000010000011011011
。这变得更加复杂,因为,但原则仍然成立

前导零唯一有意义的是,如果您使用的是已过时的字符串表示法,或者是由
sprintf
type函数生成的字符串表示法


只有人类才关心数字。就计算机而言,添加1+1同样困难,因为它是6916863870493370158+6471945999301299985,因为它们都是64位操作。

如果你有一个
int
值,在内部它总是表示为一定数量的位(或CPU使用的任何东西),因此你无法控制它

就内部格式而言,始终存在“前导零”,因为,例如,因为2099实际上是32位形式的
0b000000000000010000011011011
。这变得更加复杂,因为,但原则仍然成立

前导零唯一有意义的是,如果您使用的是已过时的字符串表示法,或者是由
sprintf
type函数生成的字符串表示法


只有人类才关心数字。就计算机而言,1+1与6916863870493370158+6471945999301299985相加同样困难,因为它们都是64位运算。

如果将数字存储为整数(例如,
int
)或浮点类型,任何格式信息都不可避免地丢失:只存储数字的二进制表示形式。(这可能有助于把它看作是保存数字的概念,例如“两个”,而不是书写时的样子。 您需要将任何附加信息存储在其他位置,例如通过保存原始字符串并将其用于输出,或者通过保存位数并将其应用于
printf
格式。还有一些十进制数库可以在内部保存数字的十进制表示形式,但这比使用本机类型要复杂得多


(或者,只需选择一种标准输出格式,并在不考虑输入的情况下使用该格式。目标真的是保持任何输入格式不变,还是始终将前导零添加到输出中就足够了?

如果将数字存储为整数(例如,
int
)或浮点类型,任何格式信息都不可避免地丢失:只存储数字的二进制表示形式。(这可能有助于把它看作是保存数字的概念,例如“两个”,而不是书写时的样子。 您需要将任何附加信息存储在其他位置,例如通过保存原始字符串并将其用于输出,或者通过保存位数并将其应用于
printf
格式。还有一些十进制数库可以在内部保存数字的十进制表示形式,但这比使用本机类型要复杂得多


(或者,选择一种规范的输出格式,不管输入是什么,都使用它。目标真的是保持任何输入格式不变,还是总是在输出中添加前导零就足够了?

这是使用
scanf
说明符
d
i
o
u
的结果,
x
a
e
f
g
是一个数学数字。没有前导零。从概念上讲,数字中没有数字;它是一个纯粹的数学实体。(注意,输入中的前导零与
i
说明符有关;前导零在解释数字时将基数更改为八进制。这仅用于输入;结果仍然是一个没有相关数字或基数的数字。)


要保留数字的前导零,必须将其视为字符串
scanf
可用于读取带有
s
c
[
说明符,尽管您可能希望使用一个简单的get character函数,如
getchar
。您必须自己计算前导零。剩余的数字也可以作为字符串处理,或者可以将其转换为数字。

使用
scanf
说明符
d
i
,的结果,
o
u
x
a
e
f
g
是一个数学数字。没有前导零。从概念上讲,数字中没有数字;它是一个纯数学实体。(注意,输入中的前导零与
i
说明符有关;前导零在解释数字时将基数更改为八进制。这仅用于输入;结果仍然是一个没有相关数字或基数的数字。)


要保留数字的前导零,必须将其视为字符串。
scanf
可用于读取带有
s
c
[
说明符,尽管您可能希望使用一个简单的get character函数,例如
getchar
。您必须自己计算前导零。剩余的数字也可以作为字符串处理,或者可以将其转换为数字。

如前所述,数字没有前导零。
printf("Enter num: ");
char buf[50];
scanf("%s", &buf);
printf("You entered: %s", buf);
int num;
int n1, n2;
if (scanf(" %n%d%n", &n1, &num, &n2) != 1) {
  puts("Failed to read an int");
}
else {
  int length = n2 - n1;
  printf("%0*d\n", length, num);
}
  007
007