printf中没有扫描的0

时间:2018-12-28 05:59:17

标签: c printf

在此代码的数字scanf()中,如果我输入input 01234567,则printf()函数将输出1234567,而不会输出0。该如何解决该问题?

#include<stdio.h>
int main()
{
    long int number , date , month , year ;
    char name[50];

    printf("Enter name \n");
    gets(name);
    printf("Enter mobile number\n");
    scanf("%ld",&number);

    printf("Enter date of birth(date)\n");
    scanf("%ld",&date);

    printf("Enter date of birth(month)\n");
    scanf("%ld",&month);

    printf("Enter date of birth(year)\n");
    scanf("%ld",&year);

    ///printing starts
    printf("Name: %s\n",name);
    printf("Number: %ld\n",number);
    printf("DOB: %ld/%ld/%ld",date,month,year);
    return 0;
}

对于数字部分, 此代码显示输出:1234567,但输入为01234567

预期输出:01234567

3 个答案:

答案 0 :(得分:2)

数字 1、01、0000001、1.0等之间没有真正的区别,依此类推(a)。那是因为数字是,而不是格式。

如果要保留前导零,则应该将其视为字符串而不是数字。

如果您在谈论电话号码(这似乎是手头的问题),尤其如此,因为电话号码可能以许多形式出现,不符合简单的整数,例如为:

  handleClick = name => {
    const inputName = this.refs.name;
    console.log("Name before being changed: " + inputName.value); // this works

    var event = new Event("input", { bubbles: true });

    this.setNativeValue(inputName, name);
    inputName.dispatchEvent(event);
  };

  setNativeValue = (element, value) => {
    const valueSetter = Object.getOwnPropertyDescriptor(element, "value").set;
    const prototype = Object.getPrototypeOf(element);
    const prototypeValueSetter = Object.getOwnPropertyDescriptor(
      prototype,
      "value"
    ).set;

    if (valueSetter && valueSetter !== prototypeValueSetter) {
      prototypeValueSetter.call(element, value);
    } else {
      valueSetter.call(element, value);
    }
  };

您还应该对0413 198 234 (0407) 123-456 0412 diablo 保持谨慎,这是为什么它实际上已从标准中删除的少数原因之一,这是有原因的-没有安全的使用方法。相反,请研究许多更安全的选择中的任何一种,例如here


(a)显然,在数学量方面。在C源代码中,就使用的数据类型或基数而言,它们可能会有所不同。

答案 1 :(得分:2)

printf("Number: %011ld\n",number);

这将在0前面加上前缀,使其按照OP的要求是11个字符。因此, 01234567 将变为 00001234567

答案 2 :(得分:1)

要打印前导零,代码可以用数字输入的"%n"记录长度,以便以后打印。

printf("Enter mobile number\n");

int n1 = 0;
int n2 = 0;
//     v------------ consume leading spaces.
//     |vv---vv----- record offset of scan
scanf(" %n%ld%n",&n1, &number, &n2);
//               v--------------- pad with zeros as needed
//               |v-------------- width determined by argument
printf("Number: %0*ld\n", n2-n1, number);