我无法弄清楚如何将手机变量存储到数组中并将其打印在第一个switch语句中。每次运行代码时,它都会获取输入的最后一个元素并忽略其余元素。
#include <stdio.h>
#define size 3
void decompose(long long int n, int *area, int *prefix, int *line) {
int n1, n2, n3;
n1 = n / 10000000;
n2 = (n / 10000) % 1000;
n3 = (n / 1) % 10000;
*area = n1;
*prefix = n2;
*line = n3;
}
/* main program */
int main(void) {
int option;
int phone, num;
int aaa, ppp, llll;
int i = 0;
long long int phoneNumber[size] = {0LL, 0LL, 0LL};
printf("---=== Phone Numbers ===---\n\n");
do {
// Display the Option List
printf("1. Display Phone List\n");
printf("2. Add a Number\n");
printf("0. Exit\n\n");
printf("Please select from the above options: ");
scanf("%d", &option);
printf("\n");
switch (option) {
case 0: // Exit the program
printf("Exiting Phone Number App. Good Bye!!!");
break;
case 1: // Display the Phone List
// @IN-LAB
printf("Phone Numbers\n");
printf("==============\n");
// Display each number in decomposed form
for (i = 0; i < size; i++) {
printf("(%3d)-%3d-%4d", aaa, ppp, llll);
printf("\n");
}
break;
case 2: // Add a Phone Number
// @IN-LAB
printf("Add a Number\n");
printf("============\n");
scanf("%d", &phone);
for (i = 0; i < size; i++) {
decompose(phone, &aaa, &ppp, &llll);
phoneNumber[i] = phone;
}
default:
printf("Invalid menu option\n");
break;
}
} while (option != 0);
return 0;
}
答案 0 :(得分:0)
输入电话号码后,您将其拆分为组成部分,并将其保存到aaa
,ppp
和llll
。然后,将完整数字保存到phoneNumber
的所有3个元素中。你输入一个新数字的每一件事都会重复这个过程,覆盖所有这些变量的先前内容。
通过查看代码,您可以为区号,前缀和行值制作并行数组。或者,更好的是,创建一个包含这些字段的struct
,例如:
struct phoneNumber {
int areaCode;
int prefix;
int line;
}
制作一系列结构:struct phoneNumber phoneNumbers[size]
。输入新电话号码时,将片段/部分保存到阵列中最后一个未使用的条目中。
答案 1 :(得分:0)
我明白你的意思是它只引用地址而不是数字的实际余数。为什么如果我的分解变量引用aaa,ppp,llll。它似乎在它处于主要状态时工作,但是当我将它移动到解压缩功能时,它会将所有内容都搞砸了。
非常感谢您的帮助。我非常感谢你花时间回答我的问题并解释每件事情的作用。
答案 2 :(得分:0)
显示电话号码的主要问题是“您显示的是什么号码?”您需要对数字进行分解才能显示。目前,在尝试打印之前,您没有分解任何内容。你需要的东西是:
case 1: // Display the Phone List
// @IN-LAB
printf ("Phone Numbers\n");
printf ("==============\n");
// Display each number in decomposed form
for (i = 0; i < size; i++) {
if (!(phone = phoneNumber[i]))
break;
decompose (phone, &aaa, &ppp, &llll);
printf ("(%3d)-%3d-%4d", aaa, ppp, llll);
printf ("\n");
}
break;
(您还应该使用unsigned
类型来显示,因为您无法拥有电话号码的否定组件...)
同样,您需要采取输入以防止尝试将值添加到完整数组(您可以选择响应方式)。你要把这个号码放在哪个插槽?您没有跟踪阵列中当前有多少个数字。有很多方法可以做到这一点,但是一个简单的方法(自从你将数组元素初始化为零后可用)就是简单地遍历你的数组并检查0
并填充那个插槽。您还希望每次进行用户输入时都完全验证输入。这意味着检查EOF
以确定用户取消输入是否为 Ctrl + d 或 Ctrl + z (在windoze上)。这样做,你可以做类似的事情:
long long int phone;
....
case 2: // Add a Phone Number
// @IN-LAB
for (i = 0; i < size; i++) /* check for next open slot */
if (!phoneNumber[i])
break;
if (i == size) /* if list full, throw error */
fprintf (stderr, "error: list full.\n");
else {
int rtn = 0; /* capture scanf return to check EOF */
printf ("Add a Number\n");
printf ("============\n");
/* always validate input */
if ((rtn = scanf ("%lld", &phone)) == 1)
phoneNumber[i] = phone;
else if (rtn == EOF) { /* user canceled with ctrl+d (or z) */
fprintf (stderr, "NOTE: user canceled input, exiting.\n");
return 0;
}
else /* user entered something stupid */
fprintf (stderr, "error: invalid input.\n");
}
break; /* don't fall-through default */
另一个考虑因素是在各种输入之间清空input buffer
(例如stdin
),因为用户可能会输入abc
,这将导致您的下一个{{1}的所有类型的混乱1}}打电话。要清空缓冲区,只需扫描直到找到scanf
或'\n'
,例如:
EOF
最后你的do {
int c = 0;
....
while ((c = getchar()) != '\n' && c != EOF) {} /* empty input buffer */
} while (option != 0);
函数是可疑的。检查算法以确保其正确。如果您需要进一步的帮助,请告诉我。
您的decompose
无效
您正在将decompose
与long long int
混合并且溢出int
。例如,phone
是phoneNumber
的数组,但您在long long int
中读到了int
。要解决您需要的问题:
phone
然后您需要使用long long int phone;
阅读long long int
,例如:
scanf
注意: if ((rtn = scanf ("%lld", &phone)) == 1) /* always validate input */
。
示例使用/输出
%lld