是否可以在C中读取字符串,而无需提前分配固定大小的数组?
每次我声明一个固定大小的char数组时,我觉得我做错了。我总是猜测我认为最大的用途,但这并不容易。
另外,我不喜欢将较小的琴弦放在较大的容器中。感觉不对。
我错过了什么吗?还有其他方法我应该这样做吗?
答案 0 :(得分:6)
在您阅读数据时,您的缓冲区将具有固定大小 - 这是不可避免的。
然而,您可以使用fgets读取数据,并检查最后一个字符是否是'\ n',(或者您已到达文件末尾),如果没有,realloc
你的缓冲区,阅读更多。
我很少发现必要,但通常会为读取分配一个固定缓冲区,将数据读入其中,然后为其副本动态分配空间,仅分配实际占用的空间,而不是整体我最初使用的缓冲区的大小。
答案 1 :(得分:3)
当你说“提前”时,你的意思是在运行时,还是在编译时? 在编译时,你这样做:
char str[1000];
在运行时执行此操作:
char *str = new char[size];
他们只能获得正确大小的方法就是知道你要读入多少个字符。如果你正在读取文件,你可以寻找最近的换行符(或其他条件)然后你确切地知道阵列需要多大。即:
int numChars = computeNeededSpace(someFileHandle);
char *readBuffer = new char[numChars];
fread(someFileHandle, readBuffer, numChars); //probly wrong parameter order
没有其他办法可以做到这一点。从程序的角度来看,如何知道用户要按多少个键呢?您可以做的最好的事情是限制用户或任何输入。
还有一些更复杂的东西,比如创建缓冲区的链接列表,然后分配缓冲区块然后将它们链接起来。但我认为这不是你想要的答案。
编辑:大多数语言都有字符串/输入缓冲类,可以隐藏这一点。
答案 2 :(得分:2)
您必须分配固定缓冲区。如果它变小,则realloc()
变大,然后继续。
答案 3 :(得分:1)
在您阅读之前无法确定字符串长度,因此将其读入固定大小的缓冲区几乎是您唯一的选择。
我认为您可以选择以小块的形式读取字符串,但是根据您的应用程序可能无法一次性提供足够的信息。
处理这种困境的最简单方法可能是为某些字符串输入定义最大长度(#define
- 这个值的常量有助于)。在读取字符串时,请使用此预定大小的缓冲区,但请确保使用字符串命令的strncpy()
形式,以便指定要读取的最大字符数。一些常用的字符串类型(例如,文件名或路径)可能具有系统定义的最大长度。
只要正确使用固定大小的数组,就没有什么固有的“错误”(做适当的边界检查并处理输入将溢出数组的情况)。它可能导致分配未使用的内存,但不幸的是,C语言在字符串方面没有给我们太多的帮助。
答案 4 :(得分:0)
String Ropes的概念允许您创建固定大小缓冲区的树。你仍然必须拥有固定大小的缓冲区,但实际上并没有解决这个问题,但这是一种动态构建字符串的非常简洁的方法。
答案 5 :(得分:0)
您可以使用Chuck Falconer的公共域ggets
函数为您执行缓冲区管理和重新分配:http://cbfalconer.home.att.net/download/index.htm
编辑: Chuck Falconer的网站已不再可用。 archive.org still has a copy和I'm hosting a copy too。