请问还有哪些类似sprintf会自动在格式化字符串末尾添加'\0'的行为

之前写过一段程序:程序的目的是解析源文件每一行,然后将解析结果输出到另一个文件中。由于解析一行就输出一行效率太低,因此我的想法是开辟一段缓冲区,将解析结果暂存到缓冲区中,当缓冲区快满的时候把缓冲区中的数据全部写出到文件,然后重置缓冲区,重复上述行为。

预先开辟一段缓冲区(char* head),设置指针ptr指向缓冲区当前可写位置。然后每次都以sprintf(ptr,...)的形式写入字符串,然后通过ptr+=strlen(ptr)来更新ptr(因为似乎没有办法直接得到sprintf格式化的字符串的长度?),当缓冲区快满的时候将head到ptr之间的数据全部输出到文件,然后ptr重置为head,再写入新的数据,覆盖旧数据。

后来我思考了一下,这里可能会有一个bug,就是重写的时候strlen(ptr)可能会受到旧数据的影响。后来调试发现,sprintf总是会在格式化的字符串最后自动添加'0',这样也就"瞎猫碰上死耗子"般地避免了bug的出现。

请问下我这样的写法还可能有什么问题呢?有没有更好的办法呢?

此外,我还想了解一下,还有哪些函数会自动做一些事情的呢?(比如像这里sprintf会自动添加'0'这样的行为)

谢谢!

阅读 4.2k
1 个回答

在 C 里,对“字符串”的通常约定,是以 '\0' 为结尾的字符串。从而在传递字符串参数的时候,只需要一个指向字符串首字符的指针。来自 C 的操作字符串的函数(sprintf, strcpy, strcat, 等等)通常都遵循这一约定,包括在写字符串的时候,会在末尾添加一个 '\0' 。(除非在某些情况下有特殊约定)

但是,memcpy 等不是操作字符串的函数,就不会添加最后的 '\0'

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题