c中的strcpy和sprintf

时间:2017-06-08 17:28:44

标签: c printf strcpy

我正在尝试设置一些像这样的字符串变量:

char thingA[7], thingB[7], thingC[7];
strcpy(thingA, "StringA");
strcpy(thingB, "StringB");
strcpy(thingC, "StringC");
printf("%s\n", thingA);
printf("%s\n", thingB);
printf("%s\n", thingC);

但不是像这样输出:

StringA  
StringB  
StringC  

输出如下:

StringA StringB StringC  
StringB StringC  
StringC 

我用sprintf尝试了这个,但得到的结果相同。 老实说,我不知道发生了什么,或者如何解决这个问题,我在网上找不到任何东西,因为由于某种原因搜索这类东西已经证明很难。 所以基本上为什么将字符串b和c存储在a中,c存储在b?

2 个答案:

答案 0 :(得分:2)

通常的错误:你的声明只有一个字节。如果计算常量字符串中的字符数,则为7,并且您需要空格来终止'\0',否则您将覆盖内存并获取未定义的bahvaior。

因此将它们声明为[8],它会起作用。

答案 1 :(得分:1)

代码的问题在于C中的字符串是空终止的(\0),所以StringA尽管有7个可打印的字符,但实际上需要存储8个字符。三个char数组在堆栈上背靠背,因此覆盖终止空字符将导致它们被连接。每个指向char数组的指针都以不同的偏移量开始,因此thingBthingC的字符串较短,但在所有情况下printf都将读取字符串,直到它找到空字符后事情C的结尾。

请注意,这是一个经典的缓冲区溢出错误,你很幸运,在thingC之后堆栈上有一个null,否则printf将继续读取并打印更长的内存。