在 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
说明符d
、i
、o
、u
、x
、a
、e
、@9876543@30@、@9876543 的结果是一个数学数字13 .没有前导零。从概念上讲,数字中没有数字。它是一个纯粹的数学实体。 (正如Jonathan Leffler 所指出的,输入中的前导零与i
说明符有关;前导零在解释数字时将基数更改为八进制。这仅用于输入;结果仍然是一个没有相关数字或基数的数字.)
要保留数字的前导零,您必须将其视为字符串。 scanf
可用于读取带有 s
、c
和 [
说明符的字符串或单个字符,尽管您可能希望使用简单的获取字符函数,例如 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 中存储前导零的主要内容,如果未能解决你的问题,请参考以下文章