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


    直接上代码:

    #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的用法,才发现该函数实在是问题多多,使用需慎重、慎重……

  • 相关阅读:
    Bioinfomatics dataset
    在Vue中使用sass和less,并解决报错问题(this.getOptions is not a function)
    axios获取文件流并下载文件
    原码,反码,补码总结
    leetcode_sql
    Mysql中Limit用法三个简单事例
    idea新建maven项目没有target文件夹
    重启mysql
    Windows下载安装netcat(nc)命令
    启动hive
  • 原文地址:https://www.cnblogs.com/wxyy/p/wxyy.html
Copyright © 2020-2023  润新知