我遇到循环问题,我不知道为什么但循环永远不会结束。
int main(int argc, char *argv[])
{
int j;
char s[2];
for(j=1;j<=3;j++)
{
sprintf(s,"s%d",j);
printf("%s", s);
}
system("PAUSE");
return 0;
}
我认为循环应该在控制台中显示s1s2s3。
答案 0 :(得分:8)
char s[2];
应为char s[3];
,否则您将获得缓冲区溢出。
Abhineet解释了为何需要进行更改。但是,为了证实他的答案,这里是标准的相关部分。
7.19.6.6
sprintf函数等效于fprintf,输出除外 写入数组(由参数s指定)而不是a 流。 在字符末尾写入空字符 写入的;它不计入返回值的一部分。如果复制 发生在重叠的对象之间,行为未定。
答案 1 :(得分:4)
缓冲区的大小应足够大,以包含整个结果字符串。
您已经将两个字符推送到s
,因此,没有足够的空间来追加\0
。这将导致未定义的行为。解决方案是提供一个额外的char内存来追加\0
。
char s[2];
至char s[3];
我知道我已经很晚才回复,但无法阻止自己解释OP,“为什么他必须使用s [3]而不是s [2]?”