2013-03-22 63 views
1

我想使用sprintf来制作一串代表文件名的字符串。这些文件将被命名为1,2,3,4,5 ...但是当我这样做时,我会遇到一些奇怪的错误。 for循环仅打印出第一轮。输出如下所示:STR:1.xlxs I:7567468sprintf使一堆文件名

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); 
} 

回答

1

您在str预留的空间太小。您需要为i用于扩展".xlxs"和另一个拖尾\0一个字符,5,所以声明str,如:

char str[7]; 

以适应您的字符串。因为,如果缓冲区太小,printf找不到\0,并会打印找到的所有数据,直到出现\0

0

您的str缓冲区只有3个字符长,但是您要输入的字符串要大得多。它的工作原理是因为在这种情况下你碰巧能够写出数组的末尾而不会发生任何不良事件。

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); 
} 
+0

“1.xlxs”是7字节 – 2013-03-22 07:25:03

+0

@Aniket ya进行了修正 – 2013-03-22 07:27:06

0

你的情况,这将是更安全的使用:

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

这将确保你不走在你的字符数组的限制。

具体而言,您至少需要char[7]才能持有"1.xlxs\0"