2009-01-28 73 views
3

練習(5-9): 用指針而不是索引來重寫例程day_of_yearK&R練習:將多維數組插入指針數組

static char daytab[2][13] = { 
    {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} 
}; 

/* day_of_year: set day of year from month and day */ 
int day_of_year(int year, int month, int day) 
{ 
    int i, leap; 

    leap = (year%4 == 0) && (year%100 != 0) || (year%400 == 0); 
    for (i = 1; i < month; i++) 
    { 
     day += daytab[leap][i]; 
    } 

    return day; 
} 

我可能只是累了,沒有想到,但如何實際上創建一個帶指針的多維數組?

我大概可以弄清楚函數的其餘部分,但我無法獲得正確的語法。

回答

2

你剛纔問到修改day_of_year程序,而不是daytab聲明。我會離開這個數組原樣,並修改day_of_year如下:

/* day_of_year: set day of year from month and day */ 
int day_of_year(int year, int month, int day) 
{ 
    char* p = (year%4 == 0) && (year%100 != 0) || (year%400 == 0) ? 
     daytab[0] : daytab[1]; 

    p++; 
    for (i = 1; i < month; i++, p++) 
    { 
     day += *p; 
    } 

    return day; 
} 

如果你想的p聲明更短,你可以這樣做:

char* p = daytab[(year%4 == 0) && (year%100 != 0) || (year%400 == 0)]; 

如果仍要移除訪問,太:

char* p = *(daytab + ((year%4 == 0) && (year%100 != 0) || (year%400 == 0))); 

有人可能會爭辯說,它看起來醜陋,但嘿,這就是你的指針會得到什麼。

+0

謝謝澄清。我感到非常沮喪。 – Tyler 2009-01-28 03:45:10

2

有處理這兩種方式:

首先是模仿是c實際處理多維數組的方式,這是說完全沒有。 char [4] [4]實際上就是char [16]附近的語法糖。你可以創建一個指向一個16字節數組的指針(在這種情況下),並且你有同樣的事情。

另一種是創建一個指向指針的指針。按照前面的例子:

char **foo = malloc(sizeof(char *) * 4); 
for(int i = 0; i < 4; ++i) 
    foo[i] = malloc(sizeof(char) * 4); 
foo[0][0] = bar; 
2

以下完整的程序將做你的願望。我已經將你的數組轉換成一個字符指針(字符串)並穿插了閏年值。我也刪除了虛擬條目並調整了循環。

測試程序沒有嚴格的錯誤檢查,所以不要指望它與惡劣的參數一起工作。

#include <stdio.h> 

static char *daytab = 
    "\x1f\x1f\x1c\x1d\x1f\x1f" 
    "\x1e\x1e\x1f\x1f\x1e\x1e" 
    "\x1f\x1f\x1f\x1f\x1e\x1e" 
    "\x1f\x1f\x1e\x1e\x1f\x1f"; 

/* day_of_year: set day of year from month and day */ 
int day_of_year(int year, int month, int day) { 
    int i, leap; 

    leap = (year%4 == 0) && (year%100 != 0) || (year%400 == 0); 
    for (i = 0; i < month-1; i++) { 
     day += *(daytab+i*2+leap); 
    } 

    return day; 
} 

int main (int argc, char *argv[]) { 
    if (argc != 4) { 
     printf ("Usage: blah yy mm dd\n"); 
     return 1; 
    } 
    printf ("%4.4s/%2.2s/%2.2s -> %04d/%02d/%02d -> %d\n", 
     argv[1], argv[2], argv[3], 
     atoi (argv[1]), atoi (argv[2]), atoi (argv[3]), 
     day_of_year (atoi(argv[1]),atoi(argv[2]),atoi(argv[3]))); 
    return 0; 
} 
+0

感謝您抽出寶貴的時間來代碼了! 這真的很有幫助。 – Tyler 2009-01-28 03:46:00

0

舊線程,但我實際上有一個解決方案,不使用索引,甚至沒有[0]。因此,而不是寫

day += daytab[leap][i]; 

寫的

day += *(*(daytab+leap)+i);