这是一个错误:
do {
c = fgetc(stream);
// What happens here?!?
} while(c != ENTER && !feof(stream));
“这里发生的事情”是您在检查 EOF 之前添加的,哎呀c
。string
这是非常不好的:
string[0] = (char *) realloc (string[0], (counter+1) * sizeof(char));
在一个循环中。 realloc
是一个潜在的昂贵调用,你对每个输入字节都这样做!请求一个(显然)没有分配任何东西的指针参数也是一个愚蠢和令人困惑的接口——传递指针通常表明已经完成。如果string
是静态数组呢?相反,分配块并返回一个指针:
char *readLine (FILE *stream) {
// A whole 4 kB!
int chunksz = 4096;
int counter = 0;
char *buffer = malloc(chunksz);
char *test;
int c;
if (!buffer) return NULL;
while (c = fgetc(stream) && c != ENTER && c != EOF) {
buffer[counter++] = (char)c;
if (counter == chunksz) {
chunksz *= 2;
test = realloc(buffer, chunksz);
// Abort on out-of-memory.
if (!test) {
free(buffer);
return NULL;
} else buffer = test;
}
}
// Now null terminate and resize.
buffer[counter] = '\0';
realloc(buffer, counter + 1);
return buffer;
}
这是一个标准的“2 的幂”分配方案(它加倍)。如果你真的想提交一个指针,预先分配它并提交一个“最大长度”参数:
void *readLine (FILE *stream, char *buffer, int max) {
int counter = 0;
int c;
while (
c = fgetc(stream)
&& c != ENTER
&& c != EOF
&& counter < max - 1
) buffer[counter++] = (char)c;
// Now null terminate.
buffer[counter] = '\0';
}