2017-04-25 31 views
-1

我正在創建一個代碼來比較今天的日期和結構中的日期數組。每次我嘗試打印日期時,我都會返回地址,而不是實際值本身。C程序保持列表地址,而不是沒有指針的值

#include <stdio.h> 
struct date { 
    int month[2]; 
    int day[2]; 
    int year[4]; 
}; 

int cmpDate(struct date date1, struct date date2) 
{ 
if (date1.year > date2.year) 
     return 1; 
    if (date1.year < date2.year) 
     return -1; 
    if (date1.year == date2.year) 
    { 
     if (date1.month > date2.month) 
      return 1; 
     if (date1.month < date2.month) 
      return -1; 
     if (date1.month == date2.month) 
     { 
      if (date1.day > date2.day) 
       return 1; 
      if (date1.day < date2.day) 
       return -1; 
      if (date1.day == date2.day) 
       return 0; 
     } 
    } 
}; 

struct date list[10] = { { 12, 3, 2016 }, 
{ 12 , 8 ,2012 }, 
{ 9, 3, 2016 }, 
{ 11, 7, 2012 }, 
{ 11, 7, 2020 }, 
{ 11, 7, 2016 }, 
{ 8, 1, 2017 }, 
{ 12, 29, 2017 }, 
{ 10, 1, 2018 } }; 

int main(void) 
{ 
    struct date today; 
    int i; 
    int j = 0; 

    printf("Enter todays date in the following format: MM DD YYYY:\n"); 
    scanf_s("%d %d %d", today.month, today.day, today.year); 
    printf("\n"); 

    for (i = 0; i < 10; i++) 
    { 
     printf("%d %d %d\n", list[i].month, list[i].day, list[i].year); 
     printf("%d %d %d\n", today.month, today.day, today.year); 
     printf("%d\n", j); 
    } 

} 

代碼編譯罰款,但這裏是我所得到的,當我調試:

Enter todays date in the following format: MM DD YYYY: 
04 25 2017 

14979072 14979080 14979088 
9435988 9435996 9436004 
0 
14979104 14979112 14979120 
9435988 9435996 9436004 
0 
14979136 14979144 14979152 
9435988 9435996 9436004 
0 
14979168 14979176 14979184 
9435988 9435996 9436004 
0 
14979200 14979208 14979216 
9435988 9435996 9436004 
0 
14979232 14979240 14979248 
9435988 9435996 9436004 
0 
14979264 14979272 14979280 
9435988 9435996 9436004 
0 
14979296 14979304 14979312 
9435988 9435996 9436004 
0 
14979328 14979336 14979344 
9435988 9435996 9436004 
0 
14979360 14979368 14979376 
9435988 9435996 9436004 
0 
Press any key to continue . . . 

J是隻爲我要去哪裏調用函數cmpDate佔位符,所以它不是現在非常重要。任何人都可以幫我打印價值,而不是地址?

謝謝。

+1

'int month [2]; int day [2]; int year [4];' - >'int month; int day; int year;''和'scanf_s(「%d%d%d」,today.month,today.day,today.year);' - >'scanf_s(「%d%d%d」,&today.month ,&today.day,&today.year);' – BLUEPIXY

+1

如果你的編譯器沒有警告你參數與'printf'的格式字符串不匹配,你需要調整你的編譯器警告或者得到一個不同的工具鏈,即使如此,仍然搞砸了。 [見這裏的示例警告/錯誤](https://pastebin.com/5G8iNQus)。 – WhozCraig

回答

0

由於結構的成員是數組,參照他們的名字(例如list[i].day實際上導致的指針數組。您將需要在printf函數分別引用每個元件陣列中的打印所有數字。

+1

它產生一個指向數組最初元素的指針,而不是整個數組。這是相同的內存地址,但它有不同的類型。在任何情況下,將指針值傳遞給'printf'格式的'%d'具有未定義的行爲(打印十進制形式的地址是最可能的結果)。 –

0

你的數據結構定義不正確。

我認爲你假定

int year[4]; 

year定義爲一個4位數的整數。事實並非如此。鼠她,它將其定義爲一組數值爲4的int值。

試圖將int[4]對象當作int對象造成需要一段時間才能描述的問題。它與數組和指針之間的關係有關。詳情請參閱comp.lang.c FAQ的第6部分。但與此同時,不要擔心爲什麼你要看到的地址看起來像地址,只需修復代碼。

int year; 

int是保證能容納值高達至少 65535,你很可能會使用最多約2十億,所以你不需要做任何事情,最系統特別是能夠代表多年。 (如果你這樣做,你可以使用類型long而不是int,並對代碼進行相應的調整來處理不同的類型,但在這裏沒有必要這樣做。)