1

我正在尝试使用 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);
}
4

5 回答 5

5

str[3]缓冲区太小,无法容纳数据 ( ) "1.xlxs"。它至少str[7]应该保存字符串和一个空字节。

如果缓冲区太小,则会出现缓冲区溢出:

http://en.wikipedia.org/wiki/Stack_buffer_overflow

于 2013-03-22T07:19:26.927 回答
1

您在 中保留的空间太少str。您需要一个字符用于i, 5 用于扩展名".xlxs",另一个用于尾随\0,因此声明str如下:

char str[7];

适合你的字符串。因为,如果缓冲区太小,printf则无法找到\0并将打印它找到的任何数据,直到出现\0.

于 2013-03-22T07:21:01.830 回答
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);
}
于 2013-03-22T07:22:30.710 回答
0

您的str缓冲区只有 3 个字符长,但您尝试放入其中的字符串要大得多。它之所以有效,是因为您碰巧能够在这种情况下注销数组的末尾而不会发生任何不好的事情。

于 2013-03-22T07:21:19.303 回答
0

在您的情况下,使用它会更安全:

snprintf(str, sizeof(str), "%d%s", i+1, ".xlxs");

这将确保您不会超出字符数组的限制。

具体来说,您至少char[7]需要持有"1.xlxs\0".

于 2013-03-22T07:29:28.333 回答