[英]Function that reads a string from a file of unknown length
我一直在尝试拼凑一个函数,该函数允许我从未知长度的给定文件中创建一个字符串。
它应该做的是将输出字符串的大小设置为单个字符,然后对于除 EOF 之外的每个字符,将字符串的大小增加 1 并将新读取的字符添加到其中。
void readstring(FILE *f, char *s[])
{
int size = 1;
int c = 0, i = 0;
s = malloc(size*sizeof(char));
while(c != -1)
{
c = fgetc(f);
s[i] = (char)c;
i++;
if(i == size)
{
size++;
s = realloc(s, size*sizeof(char));
}
}
s[i] = '\0';
}
int main()
{
char *in = malloc(2*sizeof(char));
FILE *IN;
IN = fopen("in.txt", "r");
readstring(IN, in);
printf("%s",&in);
fclose(IN);
free(in);
return 0;
}
如果您使用的是 POSIX 兼容系统(任何现代 Linux),请不要尝试重新发明轮子。 只需使用getline()
。 它将为您管理不断增长的缓冲区,并返回一个合适的malloc()
字符串。
您将malloc()
/ realloc()
的结果分配给s
而不是*s
。 s
对readstring()
完全是本地的, *s
是s
指向的指针变量。 在main中传入指针的地址。 正确的代码如下所示:
void foo(char** out_string) {
*out_string = malloc(...);
}
int main() {
char* string;
foo(&string);
}
如果没有采用&
和指针解引用*
的地址,您的main()
就无法知道readstring()
在哪里存储了字符。
当您设置字符串的字符时,您还需要取消引用双指针:使用(*s)[i]
而不是s[i]
,因为s[i]
表示一个指针,而不是一个字符。
此外,尝试使用valgrind
运行您的程序,看看您是否可以从它向您发出的错误中学习。 它是调试内存相关问题的好工具。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.