如何找出非终止/零终止或类似的字符数组的长度?
因为我写了一个writeFile函数,我想摆脱那个'len'参数。
int writeFile(FILE * handle, char * data, int len)
{
fseek(handle, 0, SEEK_SET);
for(int i=0; i <= len; i++)
fputc(data[i], handle);
}
答案 0 :(得分:3)
你无法摆脱len参数。计算机并不是猜测你的意图的神谕。但是,您可以使用fwrite()
函数,该函数可以比fputc()
更有效地编写数据。
答案 1 :(得分:1)
没有可移植方式*,这就是使用像null终结符这样的标记值的原因。
事实上,最好指定一个长度参数,因为它允许从数据缓冲区进行部分写入(尽管在你的情况下我会使用size_t
/ std::size_t
作为长度)。
*您可以尝试在Windows上使用_msize
,但这会导致眼泪。
答案 2 :(得分:0)
#define writeFile(handle, data) writeFileImpl(handle, data, sizeof data)
答案 3 :(得分:0)
正如Seith Carnegie评论和其他人回答的那样,你不能这样做(获得任何 char数组的长度)。
某些C库为您提供了一个扩展,它给出了堆分配内存长度的(超大)估计值(例如malloc
获得的指针)。
如果您使用Boehm's garbage collector(这非常有用!),它会在<gc/gc.h>
中为您提供GC_size
功能。
但是当char数组在结构内部或调用堆栈中时,无法在运行时获取其大小。只有你的程序知道它。
答案 4 :(得分:0)
除非您有另一种确定数据长度的方法(通常使用空终止符),否则您无法删除len参数。这是因为C和C ++不存储数据的长度。此外,程序员可能会欣赏len参数。您并不总是想要写出数组中的所有字节。