记录最近在使用sprintf构造字符串时遇到的一个问题

时间:2022-04-28 13:06:44

直接上代码:

#include "stdio.h"

#include "string.h"

int main()

{

char szTmp[20] = {0};

char szDst[20] = {0};

int  i;

memset(szTmp, 'a', sizeof(szTmp)-1);

sprintf(szTmp, "%d", 2);

printf("%s\n\n", szTmp);

for (i = 0; i < sizeof(szTmp); i++)

{

printf("szTmp[%d] = %d\n", i, szTmp[i]);

}

sprintf(szDst, “%s”, szDst);

printf(“szDst: %s\n”, szDst);

return 0;

}

程序的执行结果是:

2

szTmp[0] = 50

szTmp[1] = 0

szTmp[2] = 97

szTmp[3] = 97

szTmp[4] = 97

szTmp[5] = 97

szTmp[6] = 97

szTmp[7] = 97

szTmp[8] = 97

szTmp[9] = 97

szTmp[10] = 97

szTmp[11] = 97

szTmp[12] = 97

szTmp[13] = 97

szTmp[14] = 97

szTmp[15] = 97

szTmp[16] = 97

szTmp[17] = 97

szTmp[18] = 97

szTmp[19] = 0

szDst: 2

这段代码的意图是生成一个19个字节的字符串,第一个字符是’2’,其它字符使用字符'a’填充,最后赋值给szDst。预计最后输出为szDst: 2aaaaaaaaaaaaaaaaaa,可实际最后的输出是szDst:2。Why?

通过排查,最后发现问题出现在第一个sprintf处,上面的打印已经很清楚地说明了问题,sprintf在构造一个字符串后会自动在末尾加上结束标志’\0’。因此,在第二次使用sprintf时,由于该调用碰到结束符就返回了,故最后生成的字符串只剩下了”2”。

这个小小的问题,平时基本没怎么留意过,系统自动对变量的修改总是有点让人措手不及。后来上网查了下sprintf的用法,才发现该函数实在是问题多多,使用需慎重、慎重……