我有一个将一些数据写入新文件的简单函数。它工作正常,文件已写入,但在MSVS Express 2013中调试时出现上述错误。
void writeSpecToFile(const char *fname); //in header file.
char myChar [20];
sprintf(myChar, "aa%03daa%daa", i1, i2);
const char* new_char = myChar;
writeSpecToFile(myChar);
如图所示,我只是使用sprintf将一些变量插入到字符串中(工作正常)。现在,无论我是通过myChar还是new_char,它仍然会给我提供损坏错误。
出了什么问题?
答案 0 :(得分:14)
为什么要声明大小为20的字符缓冲区?很可能sprintf
放置了比myChar更多的字符。
相反,请使用
如果您正在“猜测我阵列的最大尺寸” 路线,你要做的最后一件事是尝试计算,向下 到最后一个字符,缓冲区有多大。如果你被一个字节关闭,那可能会导致崩溃。
答案 1 :(得分:9)
假设32位int
,使用%d
打印一个将产生最多8个可见字符。
您的format-string还包含6个文字a
个字符,我们不应该忘记0-terminator。
总而言之:2*8+6+1 = 23 > 20
!!
除非有其他未公开的输入限制,否则您的缓冲区必须至少大23字节。
就个人而言,我会给它一轮32。
另外,更好地使用snprintf
并选择性地验证完整的字符串确实适合(如果它不适合你得到一个缩短的字符串,所以没有灾难)。
char myChar [32];
snprintf(myChar, sizeof myChar, "aa%03daa%daa", i1, i2);
请注意the Microsoft implementation不符合要求且不保证0终止。