C语言数组scanf输入问题:sizeof异常及高效输入方案咨询
C语言手机号数组输入问题解答
1. 为何sizeof(phoneNum)的结果是40而非10?
sizeof运算符计算的是变量或类型占用的总字节数,不是元素个数。在多数系统中,int类型占4字节,你定义的phoneNum是包含10个int元素的数组,总字节数就是10 * 4 = 40。如果要获取数组的元素个数,需要用sizeof(phoneNum) / sizeof(phoneNum[0]),这个表达式会用总字节数除以单个元素的字节数,得到准确的元素数量10。
2. 如何通过scanf成功为该数组添加元素?
你原来的循环条件用了i < sizeof(phoneNum),也就是循环会执行40次,但数组只有10个元素,不仅会让程序持续要求输入,还会导致数组越界(访问超出数组范围的内存),这是未定义行为。
修改循环条件,用数组的实际元素个数来控制循环即可,推荐用sizeof计算元素个数的方式,这样数组大小改动时不用手动修改循环条件:
#include <stdio.h> int main() { int phoneNum[10]; // 计算数组元素个数 int count = sizeof(phoneNum) / sizeof(phoneNum[0]); for (int i = 0; i < count; i++) { printf("Insert digit %d of your phone number: \n", i + 1); scanf("%d", &phoneNum[i]); } return 0; }
3. 上述逐个输入的方式不够合理,有更通用高效的输入方式
逐个输入10个数字效率低,用户体验差,而且代码通用性差。更优的方式是直接输入整个10位手机号字符串,再将每个字符转换为数字存入数组,同时可以实现基于数组大小的通用逻辑:
通用实现示例
#include <stdio.h> #include <string.h> // 通用输入函数:接收数组指针和数组大小 void inputPhoneDigits(int *digits, int size) { char input[20]; printf("Enter your %d-digit phone number: \n", size); scanf("%s", input); // 校验输入长度是否符合要求 if (strlen(input) != size) { printf("Error: Please enter exactly %d digits.\n", size); return; } // 将字符转换为数字(利用ASCII码差值:'0'的ASCII是48,字符减'0'得到对应数字) for (int i = 0; i < size; i++) { digits[i] = input[i] - '0'; } } int main() { const int PHONE_DIGIT_COUNT = 10; int phoneDigits[PHONE_DIGIT_COUNT]; inputPhoneDigits(phoneDigits, PHONE_DIGIT_COUNT); // 验证输入结果 printf("Your phone digits: "); for (int i = 0; i < PHONE_DIGIT_COUNT; i++) { printf("%d ", phoneDigits[i]); } printf("\n"); return 0; }
这种方式的优势:
- 高效便捷:用户只需输入一次完整手机号,无需逐个输入数字
- 通用性强:函数接收数组大小参数,不管是10位还是其他长度的数字序列都能适配
- 保留前导0:如果手机号以0开头,字符串方式可以完整保留,而用数字类型存储会丢失前导0
- 输入校验:可以快速判断输入长度是否符合要求,避免错误输入
内容的提问来源于stack exchange,提问作者Stamatis Tzanos
相关产品推荐
相关产品推荐

