sprintf如何在C中运行

时间:2014-02-10 13:02:08

标签: c

Linux Kernel = 2.6.32-41-generic#94-Ubuntu
语言:C

代码段:

#include <stdio.h>
int main ()
{
    char buf[5];
    int index = 0;

    for (index = 0; index < 5; index++ )
    {
        sprintf(buf,"sud_%d", index);
        printf("for index = %d\n",index);
        printf("buf = %s\n",buf);
    }

    return 0;
}

问题1:为什么上述代码片段在执行上述代码时进入循环?
问题2:sprintf是否要求目标缓冲区的最后一位填充0或'\ 0'?

如果我在上面的代码中使用缓冲区大小6(buf [6]),它可以正常工作。

任何人都可以告诉我这种行为的原因吗?

此致 Sudhansu

2 个答案:

答案 0 :(得分:4)

因为未定义的行为。

输出缓冲区buf只有5个字符大,但第一次调用sprintf()将生成字符串"sud_0",由于终结符需要6个字符。然后它在buf之外写入,触发未定义的行为。使用snprintf()

snprintf()并非“要求”在您调用之前填充之前的任何字符,但它会确保将其设置为'\0' 电话完成后。这是因为它的目的是在给定的缓冲区中构建一个完整有效的C字符串,因此必须确保字符串被正确终止。

很难(有些人会说毫无意义)推理未定义的行为,但我怀疑发生的事情是写入buf的第6个字符溢出到index,将第一个字节写入0如果您使用的是小端系统,这与执行index &= ~255相同。由于index的值应该介于0和5之间,因此它会重置为0,这会导致循环继续运行。

答案 1 :(得分:3)

您正在编写外部声明的缓冲区。这是未定义的行为。

您的char buf[5];太小了。由于'\0'终结符,您需要至少6个字符“sud_0”。