我正在使用此函数来读取char,char,文本文件或stdin输入
void readLine(FILE *stream, char **string) {
char c;
int counter = 0;
do {
c = fgetc(stream);
string[0] = (char *) realloc (string[0], (counter+1) * sizeof(char));
string[0][counter++] = c;
} while(c != ENTER && !feof(stream));
string[counter-1] = '\0';
}
但是当我打电话给它时,我的程序崩溃了,我真的不知道为什么,因为我不会忘记0终止符,我确信我正确存储了char序列。我已经验证了字符串长度,但它看起来没问题。
答案 0 :(得分:1)
更改此行
string[counter-1] = '\0';
到
string[0][counter-1] = '\0';
您希望终止存储在string[0]
的字符串。
答案 1 :(得分:1)
此代码中存在一些问题:
fgetc()
返回int
。malloc()
and friends, in C。sizeof (char)
,这只是一种非常笨拙的写1
方式,所以乘以它是非常多余的。realloc()
可能很贵。string[0]
会更清楚地写成*string
,因为它不是数组而只是指向指针的指针。EOF
的截断版本,不是很好。答案 2 :(得分:0)
这是一个错误:
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的幂”分配方案(它加倍)。如果您确实想要提交指针,请预先分配它并提交“max length”参数:
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';
}