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
相关产品推荐
相关产品推荐

