C中的sprintf重置计数变量的值

时间:2014-02-08 13:05:35

标签: c printf

我遇到了sprintf在C中重置计数器变量值的问题。简而言之就是发生了什么:

int count = 0;
count++;
printf("%d\n", count); // count will equal 1
char title[7];
sprintf(title, "%.3d.jpg", count);
printf("%d\n", count); // count now equals 0 again

这是sprintf的正常行为吗?

3 个答案:

答案 0 :(得分:13)

title太小,sprintf写的超出了title的范围,写入count,破坏了它的价值。

请注意,title需要长至少8个字节:%.3d为3,.jpg为4,终结符\0为1。

正如Grijesh Chauhan指出的那样,你可以确保你永远不会使用snprintf来写超出字符串的分配大小,即:

char title[8];
snprintf(title, sizeof(title), "%.3d.jpg", count);

答案 1 :(得分:0)

你只需要在字符串标题中有更多的空间:3位+“。jpg”= 7个字符,你需要一个额外的'\ 0'(字符串的结尾)。 Sprintf可以在诸如此类(Using sprintf will change the specified variable

的情况下更改参数

解决方案:更改

char title [7];

char title [8];

答案 2 :(得分:0)

您的问题称为buffer overflowsprintf不知道title的大小,并且写入有很多需要,即使它超出了数组的边界。要完全理解,您还必须知道字符串以零结尾。这允许在不事先了解其真实大小的情况下找到字符串的结尾。这个额外的零代替了在确定缓冲区尺寸时必须考虑的额外字符。

还要考虑snprintf的使用,以确保您不会越过缓冲区的边界。