2017-03-17 102 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!!!