我正在尝试使用sprintf制作一堆代表文件名的字符串。这些文件将命名为1,2,3,4,5 ......但是当我这样做时,我得到了一些奇怪的错误。 for循环只打印出第一轮。输出如下所示:str:1.xlxs i:7567468
char str[3];
int i;
for(i = 0; i < FILES; i++){
sprintf(str, "%d%s", i+1, ".xlxs");
printf("str: %s\n", str);
printf("i: %i\n", i);
}
答案 0 :(得分:5)
str[3]
缓冲区太小而无法容纳数据("1.xlxs"
)。保持字符串和空字节至少应为str[7]
。
如果缓冲区太小,则会出现缓冲区溢出:
答案 1 :(得分:1)
您在str
中预留了太少的空间。 i
需要一个字符,扩展名".xlxs"
需要5个字符,而\0
需要另一个字符,因此声明str
如下:
char str[7];
适合你的字符串。因为,如果缓冲区太小,printf
找不到\0
并会打印找到的任何数据,直到有\0
。
答案 2 :(得分:1)
进行此修改,你很高兴。
#define FILES 3
char str[FILES][7];
int i;
for(i = 0; i < FILES; i++)
{
sprintf(str[i], "%d%s", i+1, ".xlxs");
printf("str: %s\n", str[i]);
printf("i: %i\n", i);
}
答案 3 :(得分:0)
您的str
缓冲区只有3个字符长,但您尝试放入的字符串要大得多。它的工作原理是因为您碰巧能够在此实例中注销数组的末尾而不会发生任何错误。
答案 4 :(得分:0)
在您的情况下,使用它会更安全:
snprintf(str, sizeof(str), "%d%s", i+1, ".xlxs");
这将确保您不会超出角色阵列的限制。
具体而言,您至少需要char[7]
才能保留"1.xlxs\0"
。