2013-12-11 74 views
5

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

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

一个问题的绝佳例子。 SSCCE,预期结果,实际结果。没有什么比这更少。 –

+2

[未定义行为](http://en.wikipedia.org/wiki/Undefined_behavior) –

回答

8

char s[2];应该是char s[3];,否则你会得到缓冲区溢出。


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

7.19.6.6

sprintf函数相当于fprintf中,不同之处在于输出 被写入到一个数组(通过参数s中编SPECI FI)而不是一个 流。 空字符写在字符 末尾写成;它不被计算为返回值的一部分。如果复制 发生在重叠对象之间,则行为不确定。

+0

谢谢,现在工作正常:) – user3014282

+0

如果答案对您有帮助,请不要忘记接受。 –

+1

你可以在7分钟内接受答案(15)... – user3014282

4

documentation,

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

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

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

我知道我已经回答很迟,但无法从解释OP,管不住自己“为什么他要使用s [3],而不是S [2]?”

+0

没关系,我发现它在标准中。 – 2013-12-11 12:32:46