使用sprintf时出现循环错误

时间:2014-10-13 15:40:56

标签: c printf

我在c代码中尝试一个简单的事情:

const char *files[4];
char buffer[50];
int i;
for(i = 0; i < 5; i++){
sprintf(buffer,"test%i%s", i, ".txt");
files[i] = buffer;
}

文件输出:

test4.txt
test4.txt
test4.txt
test4.txt
test4.txt

我真正想要实现的目标:

test0.txt
test1.txt
test2.txt
test3.txt
test4.txt

任何人都可以告诉我什么是错的吗? (文件必须是const char *)

3 个答案:

答案 0 :(得分:4)

变量buffer在整个程序执行过程中具有相同的地址。

因此,files[0]files[1]files[2]files[3]都会指向同一地址。

在循环的最后一次迭代中,您尝试设置files[4],这会产生未定义的行为。


对于您想要实现的目标,您可以执行以下操作:

int i;
char files[5][50];
for (i=0; i<5; i++)
    sprintf(files[i],"test%d.txt",i);

答案 1 :(得分:2)

您正在将所有字符串复制到同一缓冲区中,因此最终所有files元素都指向同一个字符串。使用strdupmalloc或固定字符串缓冲区将名称存储在。

答案 2 :(得分:2)

尝试以下

char files[5][10];
int i;

for ( i = 0; i < 5; i++ )
{
    sprintf( files[i], "test%i%s", i, ".txt" );
}

至于你的代码然后有一个内存溢出,因为你将数组文件定义为有4个元素但使用了5个元素。而且你总是将相同的变量缓冲区地址分配给数组的元素。