对于初学者来说,我是编程的新手
我想知道如何使用scanf而不是修改printf来存储前导零的数字。与数据类型有关吗?如果是这样,那是什么?以及如何使用?我目前只知道int,double和float
例如,我想输入数字“ 02”并接收“ 02”作为输出,当我输入“ 2”时,输出也将为“ 2”。
答案 0 :(得分:3)
使用scanf
说明符d
,i
,o
,u
,x
,a
,{ {1}},e
,f
是一个数学数。没有前导零。从概念上讲,数字中没有数字。它是一个纯数学实体。 (正如Jonathan Leffler指出的那样,输入中的前导零是g
说明符;前导零会在解释数字时将基数更改为八进制。这仅用于输入;结果仍然是不带数字的数字关联的数字或基数。)
要保留数字的前导零,必须将其视为字符串。 i
可以用于读取带有scanf
,s
和c
指定符的字符串或单个字符,尽管您可能希望使用简单的get-character函数,例如[
。您将不得不自己计算前导零。其余的数字也可以作为字符串处理,也可以将它们转换为数字。
答案 1 :(得分: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
答案 2 :(得分:1)
如果将数字存储为整数(例如int
)或浮点类型,则不可避免地会丢失所有格式信息:仅存储数字的二进制表示形式。 (将其保存为数字的 idea 可能会有所帮助,例如“两个”,而不是写时的外观。)
您需要将任何其他信息存储在其他位置,例如,通过保存原始字符串并将其用于输出,或者通过保存位数并将其应用于printf
格式来进行存储。还有一些十进制数字库可以在内部保存数字的十进制表示形式,但是比使用本机类型要重得多。
(或者,仅选择一种规范的输出格式,而不论输入如何使用该格式。目标是真的保留任何输入格式吗,还是总是将前导零添加到该位置就足够了吗?输出?)
答案 3 :(得分:0)
如果您有一个int
值,在内部它总是表示为一定数量的位(或您的CPU使用的to store numbers),因此您无法对此进行控制。
内部格式始终存在“前导零”,因为例如2099实际上是32位格式的0b00000000000000000000100000110011
。由于endian issues,这变得更加复杂,但是原理仍然成立。
只有当您使用的binary coded decimal风格过时或使用sprintf
类型的函数产生的字符串符号时,才可以使用零开头。
只有人类在乎数字。就计算机而言,要添加1 + 1就像6916863870493370158 + 6471945999301299985一样困难,因为它们都是64位操作。
答案 4 :(得分:0)
如前所述,数字没有前导零。
但是您可以将其视为字符串
printf("Enter num: ");
char buf[50];
scanf("%s", &buf);
printf("You entered: %s", buf);