我的建議是要分配足夠大小的緩衝區:
char name_buffer [ 80 ];
一般來說,大多數的名字(至少常見的英文名)將在尺寸小於80個字符。如果你覺得你可能需要更多的空間,通過一切手段分配更多。
保留一個計數器變量來知道你有多少個字符已經閱讀到您的緩衝區:與fgetc()
int chars_read = 0; /* most compilers will init to 0 for you, but always good to be explicit */
此時,讀取字符的字符,直到你要麼打文件標記的結束或閱讀80字符(79真的,因爲你需要空終止符的空間)。將你讀過的每個字符存入你的緩衝區,增加你的計數器變量。
while ((chars_read < 80) && (!feof(stdin))) {
name_buffer [ chars_read ] = fgetc (stdin);
chars_read++;
}
if (chars_read < 80)
name_buffer [ chars_read ] = '\0'; /* terminating null character */
我在這裏假設您正在閱讀從stdin
。一個更完整的例子還將檢查錯誤,驗證從流中讀取的字符是否對某個人的姓名有效(例如,沒有數字)等。如果嘗試讀取的數據多於您分配空間的數據,則打印一個錯誤消息給控制檯。
我的理解是希望保持儘可能小的緩衝區,只分配需要的內容,但學習如何編程的一部分就是了解代碼/數據大小,效率和代碼可讀性的權衡。您可以使用malloc
和realloc
,但它使代碼比所需的複雜得多,它引入了可能會出現錯誤的位置 - NULL指針,數組索引超出範圍錯誤等等。對於大多數實際情況,分配什麼應該足夠爲您的數據要求加上少量的呼吸空間。如果你發現你遇到很多數據超過緩衝區大小的情況,調整你的緩衝區以適應它 - 這就是調試和測試用例的用處。
你的編輯建議realloc加倍的大小對我來說似乎很好。你可以從一個可能足夠大的數組開始(因爲你知道它是一個學生的名字),並且大部分時間避免重新分配數據。 Supercalifragilisticsuuralralidoscious Antidisestablishmentarianism先生沒有去你的學校。 – 2010-11-22 21:19:31
@保羅 - 你確信他沒有? – DMan 2010-11-22 23:58:24