You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言如何在电话号码输出中保留开头的0?

问题:电话号码处理时开头的0丢失,如何输出010.7568.5230格式?

我编写了一段C语言代码用于处理电话号码输入输出,当输入格式为(010) 7568-5230时,输出结果为10.7568.5230,开头的0丢失了。我希望输出格式为010.7568.5230,不清楚开头的0为何无法显示,猜测其在计算中被当作空白字符处理,寻求解决方法。

我的代码:

#include <stdio.h>

int main(void) {
  int Phone_number1,Phone_number2,Phone_number3 ; 
  printf("Enter phone number [(xxx) xxx-xxxx]: ");
  scanf("(%d) %d-%d" , &Phone_number1 , &Phone_number2 , &Phone_number3);
   
   printf("you entered: %d.%d.%d ",Phone_number1,Phone_number2,Phone_number3 );
  return 0;
}

输入内容:

Enter phone number [(xxx) xxx-xxxx]: (010) 7568-5230 // 我的输入

输出内容:

you entered: 10.7568.5230 // 我的输出


解决方法

原因分析

问题出在你用int类型存储电话号码分段:整数类型会自动忽略前导0,因为010作为整数的实际值就是10,输出时自然不会显示前导0,和空白字符无关,这是整数的存储特性导致的。

方案1:使用字符串存储(最稳妥)

电话号码本质是字符串而非数值,用字符数组存储能完整保留所有输入字符,包括前导0。修改后的代码如下:

#include <stdio.h>

int main(void) {
  char area_code[4], mid[5], last[5]; // 预留空间存储字符串结束符'\0'
  printf("Enter phone number [(xxx) xxx-xxxx]: ");
  // %3s 限制读取3个字符,刚好匹配区号;%4s 匹配中间和末尾的4位
  scanf("(%3s) %4s-%4s", area_code, mid, last);
  
  printf("you entered: %s.%s.%s ", area_code, mid, last);
  return 0;
}

该方案能完全保留输入的原始格式,没有位数限制的问题,是处理电话号码这类字符序列的最优选择。

方案2:格式化输出补前导0(仅限固定位数场景)

如果坚持使用整数存储,可通过格式化输出指令强制补全前导0,保证输出固定位数:

#include <stdio.h>

int main(void) {
  int Phone_number1,Phone_number2,Phone_number3 ; 
  printf("Enter phone number [(xxx) xxx-xxxx]: ");
  scanf("(%d) %d-%d" , &Phone_number1 , &Phone_number2 , &Phone_number3);
   
  // %03d 表示输出至少3位,不足时用前导0补全;%04d 对应4位的分段
  printf("you entered: %03d.%04d.%04d ",Phone_number1,Phone_number2,Phone_number3 );
  return 0;
}

注意:这个方案有局限性——如果输入的区号是001,整数存储的值是1,输出会补0成001,看起来正确但实际存储的数值和输入字符串不一致;若输入的分段位数不固定(比如区号是2位),补0后会不符合预期。因此仅推荐在确定分段位数固定的场景使用。


内容的提问来源于stack exchange,提问作者jincoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 14:43:29