2017-03-17 104 views
0

我无法弄清楚如何将电话变量存储到数组中,并将它打印在第一个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

当你进入你把它分解成组成部分电话号码,并把它们保存到aaapppllll。然后将全部数字保存到phoneNumber的所有3个元素中。每输入一个新数字,你都会重复这个过程,覆盖所有这些变量的前一个内容。

从查看您的代码,您可以为区域代码,前缀和行值创建并行数组。或者,更好,创造一个struct包含这些领域,如:

struct phoneNumber { 
    int areaCode; 
    int prefix; 
    int line; 
} 

,并使这些结构的数组:struct phoneNumber phoneNumbers[size]。当您输入新的电话号码时,将这些部分/部分保存到阵列中最后一个未使用的条目中。

0

我明白你的意思是只引用地址而不是数字的实际剩余部分。为什么如果我的分解变量引用aaa,ppp,llll。它似乎工作时,它是在主要的,但当我把它移动到解压缩功能,它拧紧了一切。

非常感谢您的帮助。我非常感谢您花时间回答我的问题并解释每件事情的作用。

+0

看到除了我的答案。 –

+0

请保存mods的一些工作,并删除它。答案不是评论。 –

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 + dCtrl + 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这将导致各种混乱与你的下一个致电scanf。要清空缓冲区,只需扫描,直到找到'\n'EOF。:

do { 
    int c = 0; 
    .... 
    while ((c = getchar()) != '\n' && c != EOF) {} /* empty input buffer */ 

} while (option != 0); 

最后您的decompose函数是可疑的。检查算法以确保它是正确的。让我知道你是否需要进一步的帮助。


原因,您decompose不工作

您与int混合long long int和溢出phone。例如phoneNumberlong long int的一个数组,但您将int读入phone。要解决此问题,您需要:

long long int phone; 

,然后你需要阅读long long intscanf,例如:

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

注:%lld

示例使用/输出

Please select from the above options: 2 

Add a Number 
============ 
8885551212 
1. Display Phone List 
2. Add a Number 
0. Exit 

Please select from the above options: 1 

Phone Numbers 
============== 
(888)-555-1212 
1. Display Phone List 
2. Add a Number 
0. Exit 

Please select from the above options: 0 

Exiting Phone Number App. Good Bye!!!