我遇到了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的正常行为吗?
答案 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 overflow。 sprintf
不知道title
的大小,并且写入有很多需要,即使它超出了数组的边界。要完全理解,您还必须知道字符串以零结尾。这允许在不事先了解其真实大小的情况下找到字符串的结尾。这个额外的零代替了在确定缓冲区尺寸时必须考虑的额外字符。
还要考虑snprintf
的使用,以确保您不会越过缓冲区的边界。