是否可以在C中读取未知大小的字符串,而不必将其放入预先分配的固定长度缓冲区中?

Dao*_*oyd 9 c

是否可以在C中读取字符串,而无需提前分配固定大小的数组?

每次我声明一个固定大小的char数组时,我觉得我做错了.我总是猜测我认为最大的用途,但这并不总是那么容易.

另外,我不喜欢将较小的弦放在较大的容器中的想法.感觉不对劲.

我错过了什么吗?还有其他方法我应该这样做吗?

Jer*_*fin 7

在您读取数据时,您的缓冲区将具有固定大小 - 这是不可避免的.

但是,您可以使用fgets读取数据,并检查最后一个字符是'\n',(或者您是否已到达文件末尾),如果没有,则检查realloc缓冲区,并阅读更多内容.

我很少发现必要,但通常会为读取分配一个固定缓冲区,将数据读入其中,然后为其副本动态分配空间,仅分配实际占用的空间,而不是整个大小.我最初使用的缓冲区.


Chr*_*s H 3

当你说“提前”时,你的意思是在运行时,还是在编译时?在编译时你这样做:

char str[1000];
Run Code Online (Sandbox Code Playgroud)

在运行时你这样做:

char *str = new char[size];
Run Code Online (Sandbox Code Playgroud)

获得正确大小的唯一方法是知道您要读入多少个字符。如果您正在从文件中读取,您可以寻找最近的换行符(或其他一些条件),然后您就知道如何执行数组需要很大。IE:

int numChars = computeNeededSpace(someFileHandle);
char *readBuffer = new char[numChars];
fread(someFileHandle, readBuffer, numChars);  //probly wrong parameter order
Run Code Online (Sandbox Code Playgroud)

没有其他方法可以做到这一点。站在程序的角度来看,它如何知道用户要按多少个键?您能做的最好的事情就是限制用户或任何输入。

还有一些更复杂的事情,例如创建缓冲区的链接列表,分配缓冲区块然后将它们链接起来。但我认为这不是您想要的答案。

编辑:大多数语言都有字符串/输入缓冲区类,可以向您隐藏这一点。