将参考值存储在数组中

时间:2017-03-17 01:02:19

标签: c

我无法弄清楚如何将手机变量存储到数组中并将其打印在第一个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;
}

3 个答案:

答案 0 :(得分:0)

输入电话号码后,您将其拆分为组成部分,并将其保存到aaapppllll。然后,将完整数字保存到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无效

的原因

您正在将decomposelong long int混合并且溢出int。例如,phonephoneNumber的数组,但您在long long int中读到了int。要解决您需要的问题:

phone

然后您需要使用long long int phone; 阅读long long int,例如:

scanf

注意: if ((rtn = scanf ("%lld", &phone)) == 1) /* always validate input */

示例使用/输出

%lld