之前写过一段程序:程序的目的是解析源文件每一行,然后将解析结果输出到另一个文件中。由于解析一行就输出一行效率太低,因此我的想法是开辟一段缓冲区,将解析结果暂存到缓冲区中,当缓冲区快满的时候把缓冲区中的数据全部写出到文件,然后重置缓冲区,重复上述行为。
预先开辟一段缓冲区(char* head),设置指针ptr指向缓冲区当前可写位置。然后每次都以sprintf(ptr,...)的形式写入字符串,然后通过ptr+=strlen(ptr)来更新ptr(因为似乎没有办法直接得到sprintf格式化的字符串的长度?),当缓冲区快满的时候将head到ptr之间的数据全部输出到文件,然后ptr重置为head,再写入新的数据,覆盖旧数据。
后来我思考了一下,这里可能会有一个bug,就是重写的时候strlen(ptr)可能会受到旧数据的影响。后来调试发现,sprintf总是会在格式化的字符串最后自动添加'0',这样也就"瞎猫碰上死耗子"般地避免了bug的出现。
请问下我这样的写法还可能有什么问题呢?有没有更好的办法呢?
此外,我还想了解一下,还有哪些函数会自动做一些事情的呢?(比如像这里sprintf会自动添加'0'这样的行为)
谢谢!
在 C 里,对“字符串”的通常约定,是以
'\0'
为结尾的字符串。从而在传递字符串参数的时候,只需要一个指向字符串首字符的指针。来自 C 的操作字符串的函数(sprintf
,strcpy
,strcat
, 等等)通常都遵循这一约定,包括在写字符串的时候,会在末尾添加一个'\0'
。(除非在某些情况下有特殊约定)但是,
memcpy
等不是操作字符串的函数,就不会添加最后的'\0'
。