C中的sprintf,循环永不结束

时间:2013-12-11 11:26:09

标签: c printf

我遇到循环问题,我不知道为什么但循环永远不会结束。

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。

2 个答案:

答案 0 :(得分:8)

char s[2];应为char s[3];,否则您将获得缓冲区溢出。


Abhineet解释了为何需要进行更改。但是,为了证实他的答案,这里是标准的相关部分。

  

7.19.6.6

     

sprintf函数等效于fprintf,输出除外   写入数组(由参数s指定)而不是a   流。 在字符末尾写入空字符   写入的;它不计入返回值的一部分。如果复制   发生在重叠的对象之间,行为未定。

答案 1 :(得分:4)

来自documentation,

  

缓冲区的大小应足够大,以包含整个结果字符串。

您已经将两个字符推送到s,因此,没有足够的空间来追加\0。这将导致未定义的行为。解决方案是提供一个额外的char内存来追加\0

char s[2];char s[3];

我知道我已经很晚才回复,但无法阻止自己解释OP,“为什么他必须使用s [3]而不是s [2]?”