我需要一些关于sprintf和array []的澄清

问题描述

method tell-secret { 
  say self!Animal::secret
}

这是buff(即10)的正确数组初始化吗?或者我需要用17初始化。

解决方法

如果您要使用sprintf进行覆盖,则它不需要特别包含任何内容,只需足够大以容纳数据。

换句话说,= {0}就足够了,在这种情况下实际上是可选的。

PSA:请勿使用,例如sprintf的函数,缺少长度参数。而是在有长度参数的地方使用snprintf和相关函数。如果不采取适当的预防措施,缓冲区溢出错误是C语言中的一个大问题。

您应该在C语言中编写的代码大致为:

size_t buff_size = 255;
char buff[buff_size];
char* name = "Aadhi";

snprintf(buff,buff_size,"My names is %s",name);

其中不仅包含占位符参数,而且重要的是应包含的值。

在C ++中,您应该完全跳过此步骤,而是:

std::string name = "Aadhi";
std::string message = "My name is " + name;

std::string避免了几乎所有与缓冲区溢出错误有关的问题。

C ++ 20引入了一个新的std::format功能,其功能与sprint类似,但没有所有缓冲区溢出问题:

std::string name = "Aadhi";
std::string message = std::format("My name is {}",name);