我的建议是要分配足够大小的缓冲区:
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