在 C 中存储前导零

Posted

技术标签:

【中文标题】在 C 中存储前导零【英文标题】:Store leading zeroes in C 【发布时间】:2019-02-23 22:24:36 【问题描述】:

对于初学者来说,我是编程新手

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

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

【问题讨论】:

没有这样的数字“02”。您可以按原样存储字符串,也可以单独存储字符串中前导零的数量(如果有)。 数字类型没有前导零的概念。他们甚至没有十进制数系统的概念。这一切都只是二进制。 危险。将 010 解释为 8 可以原谅智能输入例程,因为前导 0 用于指定 八进制 常量。 @LeonardoAlvesMachado 从技术上讲,char c[5] 将是一个 4 字母字符串,因为第五个字符将是终止 NUL 字节,通常不被视为“字母”(例如,根据strlen)。此外,C 中的字符串特别是一个由 NUL 字节终止的char 数组,而char c[5] 也可能只包含五个不是字符串或用作一个字符串的char @LeonardoAlvesMachado: char c[5]; 定义了一个能够容纳 5 个元素(char 类型)的数组。 “字符串”需要一个终止 '\0' 字节,它必须在底层数组中。所以,c 可以容纳最多 4 个字母长度的字符串。 【参考方案1】:

使用scanf 说明符diouxae、@9876543@30@、@9876543 的结果是一个数学数字13 .没有前导零。从概念上讲,数字中没有数字。它是一个纯粹的数学实体。 (正如Jonathan Leffler 所指出的,输入中的前导零与i 说明符有关;前导零在解释数字时将基数更改为八进制。这仅用于输入;结果仍然是一个没有相关数字或基数的数字.)

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

【讨论】:

对于%i,前导零很重要——017 和 17 是不同的值(八进制 017 是十进制的 15;17 仍然是十进制的 17)。这会捕获人们使用%i 编写日期解析代码来扫描日期或月份(使用%i,输入09 给出零值,并将9 留给下一个转换说明符解释)。 【参考方案2】:

如何存储带有前导零的数字 (?) 我目前只知道 int、double 和 float

要存储一个整数,前导零计数是 2 条信息。读取用户输入时,记录数字其长度或文本宽度。

" " 消耗空格。"%n" 记录到目前为止扫描的字符的偏移量。这不影响scanf()的返回值。

int num;
int n1, n2;
if (scanf(" %n%d%n", &n1, &num, &n2) != 1) 
  puts("Failed to read an int");

否则,打印它。"0":用零填充。"*":从参数列表导出的最小打印宽度。

else 
  int length = n2 - n1;
  printf("%0*d\n", length, num);

输入/输出

  007
007

【讨论】:

【参考方案3】:

如果您将数字存储为整数(例如,int)或浮点类型,任何格式信息都不可避免地丢失:仅存储数字的二进制表示。 (将其视为保存数字的 idea 可能会有所帮助,例如“二”,而不是写入时的外观。)

您需要在别处存储任何附加信息,例如通过保存原始字符串并将其用于输出,或者通过保存位数并将其应用于printf 格式。还有一些十进制数库可以在内部保存数字的十进制表示,但这比使用本机类型要重得多。

(或者,只需选择规范的输出格式并使用它而不管输入。目标真的是保持任何输入格式原样,还是总是添加前导零就足够了输出?)

【讨论】:

【参考方案4】:

如前所述,数字没有前导零。

但是你可以把它当作一个字符串来处理

printf("Enter num: ");
char buf[50];
scanf("%s", &buf);
printf("You entered: %s", buf);

【讨论】:

【参考方案5】:

如果您有一个 int 值,则在内部它始终表示为一定数量的位(或您的 CPU 使用的任何 to store numbers),因此您无法控制它。

就内部格式而言,总是有“前导零”,例如,因为 2099 实际上是 32 位格式的 0b00000000000000000000100000110011。由于endian issues,这变得更加复杂,但原理仍然成立。

前导零唯一有意义的情况是,如果您使用的是已经过时的binary coded decimal,或者是由sprintf 类型函数生成的字符串表示法。

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

【讨论】:

以上是关于在 C 中存储前导零的主要内容,如果未能解决你的问题,请参考以下文章

将 int 存储到 SQL,但保持前导零

在保持正确对齐的同时消除前导零

在 Blade 视图中保留前导零

在C中保持前导零[重复]

如何在 C sprintf 中添加用户定义的变量前导零?

C 编程:模数是不是忽略结果中的前导零?我怎样才能阻止它? [复制]