2010-12-02 47 views
0

我正在生成一個C程序,該程序生成「記錄」的雙向鏈接列表。你可以從一個特定長度的數組中創建一個c結構體嗎?

我有我的結構原型如下:

struct custRec(char[20] name, char[50] address, char[20] city, 
     char[2] stateAbbreviation, int zipCode, float balance); 
struct linkedRec(custRec storedRec, custRec* nextRec, custRec* prevRec); 

具體來說,我custRec結構,是有效使用char[20]名代替char[]名字?通過「有效」,我的意思是 - 我試圖限制「名稱」字段正好19個字符(+空終止符)。我應該擔心其他地方的長度,並讓結構接受任何長度的char數組?

+0

這兩個選項之間的差異是非常微不足道的。 – Falmarri 2010-12-02 22:19:12

回答

2

此語法不正確(我誤解了這個問題首先是因爲它們看起來像函數聲明,而不是結構定義):

struct custRec(char[20] name, char[50] address, char[20] city, 
     char[2] stateAbbreviation, int zipCode, float balance); 
struct linkedRec(custRec storedRec, custRec* nextRec, custRec* prevRec); 

你大概的意思是:

typedef struct custRec 
{ 
    char name[20]; 
    char address[50]; 
    char city[20]; 
    char stateAbbreviation[2]; 
    int zipCode; 
    float balance; 
} custRec; // Necessary because question is about C, not C++ 

typedef struct linkedRec 
{ 
    custRec storedRec; 
    custRec *nextRec; 
    custRec *prevRec; 
} linkedRec; 

我注意到,在美國州的縮寫是2個字符,所以你可能需要使用char state[3]來允許終止空。

這現在在語法上是有效的。當您將數據複製到custRec的字段中時,您需要小心以確保您的複製不會溢出邊界。編譯器不執行長度。

因此,您需要檢查函數內部傳遞給您的字符串是否超出您所期望的範圍。

如果您不希望對長度施加限制,則可以將所有字符串結構成員設置爲char *,並且可以爲任意長度的字符串動態分配內存。但這對美國的州名縮寫可能不是一個好主意;那麼你確實想要執行'2個字符加上'\0''的限制。

+0

謝謝。你對州的縮寫也是正確的。 – 2010-12-02 22:47:21

0

是的,按照您所描述的方式聲明具有固定長度字符串的結構是很常見的。您需要非常小心,以確保所有操作都能確保它們不超過長度,並且還能正確終止域。否則,你會得到各種奇怪的錯誤。

是的,您需要指定char[20]而不是char[],因爲您需要爲數據預留空間。

但是,請注意,這確實會在這些字段上設置一個任意的上限,並且使得稍後擴展更加困難。考慮定期使用char*字段,並在堆上分配字符串,以便處理任何長度的字符串。這也需要一些謹慎的內存管理(特別是清理!)。

相關問題