sprintf错误以及类型转换

2023-11-12

最近,编写一个程序需要将两个字符串连接起来,我使用了sprintf函数,总是出现错误的结果。后来,把结果打印出来,才发现原来是char指针中有空字符(ASCII码为0的字符)。我的错误代码如下:

unsigned char szbuffer[1024];

unsigned char head[10]={0xFF,0xFF,0x01,0x01,0x06,0x01,0x00,0x00,0x00,0x00};

char * sfile="<FILE_LOCATION_REQ><FILE_ID>4567FEDC4567FEDC4567FEDC4567FEDC4567FEDC4567FEDC</FILE_ID></FILE_LOCATION_REQ>";
sprintf((char *)szbuffer,"%.10s%s",head,sfile);

结果,总是不能连接成功,后来又尝试使用strcat函数,将两个字符串连接:代码如下:

for (i=0;i<10;i++)
szbuffer[i]=head[i];

strcat((char *)szbuffer,sfile);

后来,我才发现,原来是head中有ASCII码值为0的字符,而这个字符,在字符串中是字符串的结束符号。所以,是用sprintf和strcat时,遇到0x00字符串都会结束。我又找了一下别人使用sprintf的总结,放在下面:

以下为我在编程的过程中用到sprintf,后查找资料及自己的一些总结。感谢网上资料的帮助。
在很多场合可以使用sprintf来实现类型转换,
int sprintf( char *buffer, const char *format [, argument] ... );
  除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数.
比如
1. const char* 转换成char*
有时我们需要把string类型的字符串转换成char*,但是string.c_str()等到的结果是const char*类型而不是char*类型,转换方法就是先把string转换成const char*,然后用sprintf把const char*转换成char*
如:string str;
char* strchar;
const char* strC = str.c_str();
sprintf(strchar,"%s",str.c_str());
2.将int类型转换成char*
//把整数123 打印成一个字符串保存在s 中。
 sprintf(s, "%d", 123); //产生"123"
3.将浮点数转换成char*
但有时我们希望自己控制打印的宽度和小数位数,这时就应该使用:”%m.nf”格式,其中m 表示打印的宽度,n 表示小数点后的位数。比如:
  sprintf(s, "%10.3f", 3.1415626); //产生:" 3.142"
4.实现字符串的连接
char* who = "I";
  char* whom = "CSDN";
  sprintf(s, "%s love %s.", who, whom); //产生:"I love CSDN. "

使用sprintf 的常见问题
  sprintf 是个变参函数,使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访问错误,但好在由sprintf 误用导致的问题虽然严重,却很容易找出,无非就是那么几种情况,通常用眼睛再把出错的代码多看几眼就看出来了。
1 缓冲区溢出
第一个参数的长度太短了,没的说,给个大点的地方吧。当然也可能是后面的参数的问题,建议变参对应一定要细心,而打印字符串时,尽量使用”%.ns”的形式指定最大字符数。
2.忘记了第一个参数低级得不能再低级问题,用printf 用得太惯了。
3.变参对应出问题通常是忘记了提供对应某个格式符的变参,导致以后的参数统统错位,检查检查吧。尤其是对应”*”的那些参数,都提供了吗?不要把一个整数对应一个”%s”.


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sprintf错误以及类型转换 的相关文章

  • Python_Logging日志模块(一)

    一 日志的作用 展现当前程序的活动情况 记录程序的运行轨迹 规范稳定的日志可以帮助开发者迅速定位程序的问题 二 日志的内容 正常情况下 一条完整的日志应该包含调用日志的时间戳 数字形式的日志级别 调用日志的实例化函数的路径 线程名 抛出的活
  • sheel脚本

    sheel脚本 sheel脚本 sheel脚本 sheel脚本的工作方式有两种 交互式和批处理 交互式 用户输入一条就立即执行 批处理 由用户实现编写好一个完整的sheel脚本 sheel会一次执行脚本中诸多命令 脚本中不仅会用到一般的li
  • 测试用例设计方法之等效类,边界值

    概念 等价类划分是一种黑盒测试方法 把无限的测试变成有限的测试 把所有可能的输入数据 即程序的输入域划分成若干等价类 然后从每一个等价类中选取少数具有代表性的数据作为测试用例 依据需求将输入 特殊情况下会考虑输出 划分为若干个等价类 从等价
  • 红帽linux认证有哪些方向

    红帽Linux认证有以下几个方向 RHCSA 红帽认证系统管理员 该认证是红帽认证中的初级认证 主要考察考生对Linux系统管理的掌握程度 包括系统安装 文件系统管理 用户和组管理 网络管理等 RHCE 红帽认证工程师 该认证是红帽认证中的
  • 高德地图定位

    高德地图开放平台 获取key 获取key值后 将其在index html中引入 然后来到App vue下 即根组件下 一进项目就可以获取定位 所以在钩子函数created 中实现定位功能
  • OpenAi 嵌入

    什么是嵌入 OpenAI 的文本嵌入衡量文本字符串的相关性 嵌入通常用于 搜索 结果按与查询字符串的相关性排序 聚类 其中文本字符串按相似性分组 推荐 推荐具有相关文本字符串的项目 异常检测 识别出相关性很小的异常值 多样性测量 分析相似性
  • 2018-2019-2 网络对抗技术 20165322 Exp2 后门原理与实践

    2018 2019 2 网络对抗技术 20165322 Exp2 后门原理与实践 目录 实验准备 后门概念 常用后门工具 实验内容与步骤 使用netcat获取主机操作Shell cron启动 使用socat获取主机操作Shell 任务计划启
  • 阿里带火的中台到底是什么?白话中台战略

    作者 王健 ThoughtWorks首席咨询师 十多年国内外大型企业软件设计开发 团队组织转型经验 一直保持着对技术的热爱 热衷于技术分享 目前专注在企业平台化转型 中台战略规划 微服务架构与实施 大型遗留系统服务化改造 敏捷精益转型 以及
  • IOS工程添加目录

    问题 ios工程和资源工程是分开的 需要将工程外的一个文件夹导入到ios工程中 以前是直接拷贝一份放在frameworks runtime src proj ios mac中 这样操作的缺点就是 修改了公共的资源后 还需要再修改ios工程下
  • 微信小程序的computed的使用

    1 官方参考地址 computed 微信开放文档 qq com 2 自定义组件component和behaviors component参考地址 自定义组件 微信开放文档 qq com behaviors参考地址 behaviors 微信开
  • Solidity中引入的SPDX是什么

    Solidity中引入的SPDX是什么 起因 Solidity 0 6 8 要求引入 SPDX 许可证 否则会出现警告 Warning SPDX license identifier not provided in source file
  • MyBatis万能插入语句

    MyBatis万能插入语句 前言 最近需要做一个动态新增数据的接口 表名 列名 数据都是动态传进来的 需要一个接口就可以把所有表数据新增成功 第一种方式 首先看Mapper dao层 接口 插入数据 param tableName 表名 p
  • linux 解压所有以zip结尾的文件_Linux的压缩/解压缩文件处理 zip & unzip

    Linux的压缩 解压缩命令详解及实例 压缩服务器上当前目录的内容为xxx zip文件 zip r xxx zip 解压zip文件到当前目录 unzip filename zip 另 有些服务器没有安装zip包执行不了zip命令 但基本上都
  • C++中vector的使用

    向量std vector是一种对象实体 能够容纳许多各种类型相同的元素 包括用户自定义的类 因此又被称为序列容器 与string相同 vector同属于STL Standard Template Library 中的一种自定义的数据类型 可
  • VTK“静态编译”与“动态编译”的区别:

    静态编译 与 动态编译 的区别 静态编译就是在编译的时候把所有的模块都编译进可执行文件 exe 里去 当启动这个可执行文件时所有的模块都已加载进来 动态编译则是编译的时候需要的模块都没有编译进去 一般情况下可以把这些模块都编译成动态链接库D
  • exec族函数配合fork使用(linux系统编程)

    execl 函数配合fork 函数 在执行A程序的过程中去执行B程序 代码B 用来改文件中的数值 include
  • Google签名证书和base64密钥

    keystore重点说明 1 打包aab时 需要自己创建当前应用的keystore 这个是开发者的应用的keystore 以后上传这个应用都使用这个keystore 2 Google的签名证书 作用是当应用上传Google商店后 Googl
  • 运行时链接

    基本概念 运行时链接 是在程序运行时 而非编译时或加载时 将程序代码与其依赖的库代码进行链接的过程 动态链接在程序启动时或实际运行过程中通过API函数完成 这种方式的主要优点是它允许程序在运行时加载和卸载不同的库模块 从而实现更高的模块化和
  • 敏捷开发“松结对编程”实践之三:共同估算篇(大型研发团队,学习型团队,139团队,师徒制度,敏捷设计,估算扑克,扑克牌估算)

    转载自 http blog csdn net cheny com article details 6587277 本文是 松结对编程 系列的第三篇 之一 之二 之三 之四 之五 之六 之七 之八 此系列之九及之后文章请见栏目总目录 估算是经
  • 使用FFMPEG将WebM转为MP4或MKV

    PS5 自带的录像功能导出的格式是WebM 同时视频是HDR默认60帧 我们有时需要转成其他格式保存 下面两个命令可以将其转成mkv或者mp4格式 ffmpeg i test webm vf zscale t linear npl 100

随机推荐

  • C++基础之const

    C 中什么是常量 常量 在程序运行期间不能发生改变的变量 常量不限制类型 但是在定义之后值不可修改 c 中定义常量有两种方法 使用宏定义 define预处理器 来自C语言 define DEF WINDOW WIDTH 720 使用cons
  • java简单毕设_[手把手教你做毕设](专栏介绍)

    引子 我并没有写过毕设相关的博文 但是每周都有不少人咨询我毕设相关的系统开发问题 OK 好像很久很久以前 写过一个 JSP Servlet培训班作业管理系统 说实话写得一般 确实一般 不是谦虚 以致于心有愧欠 感觉貌似大概可能也许差不多 误
  • 55个mes项目解决方案及案例_我调查了 20 个 MES 项目实施情况,发现了这些

    本文首发于 智能制造社区 作者Raylan 昨天智能制造社区的 Raylan 同学设计了个简单的问卷 想分析下 MES 项目的执行情况 所以就在我们社区微信群里简单做了抽样 此次调研是匿名调研 问卷接收数量大约在44 63之间 问卷返回数量
  • 从0开始写Vue项目-Vue实现用户数据批量上传和数据导出

    从0开始写Vue项目 环境和项目搭建 慕言要努力的博客 CSDN博客 从0开始写Vue项目 Vue2集成Element ui和后台主体框架搭建 慕言要努力的博客 CSDN博客 从0开始写Vue项目 Vue页面主体布局和登录 注册页面 慕言要
  • IDEA常用快捷键(Windows)

    Ctrl S 保存文件 Ctrl C 复制 Ctrl X 剪切 Ctrl V 粘贴 Ctrl Z 撤销 Ctrl Y 重做 Ctrl F 查找 Ctrl Shift F 全局查找 Ctrl R 替换 Ctrl D 复制当前行或选中区域到下一
  • 编写一个名为collatz()的函数,它有一个名为number的参数。如果参数是偶数,那么collatz()就打印出number // 2,并返回该值。如果number是奇数,collatz()就打印

    要求 编写一个名为collatz 的函数 它有一个名为number的参数 如果参数是偶数 那么collatz 就打印出number 2 并返回该值 如果number是奇数 collatz 就打印并返回3 number 1 使用软件 vsco
  • 深度学习 情感分析_使用深度学习进行情感分析

    深度学习 情感分析 介绍 Introduction The growth of the internet due to social networks such as Facebook Twitter Linkedin Instagram
  • Mule的学习(一、mule的认知)

    参考 https blog csdn net a victory article details 70216772 https blog csdn net lishehe article details 33394895 https www
  • U盘读写速度优化

    从android设备上向U盘上传文件 时间比较长 优化后 时间大幅度缩短 经过几次测试 8k的缓存可以达到传输速度和容错率的平衡点 超过了太容易出错 低于8k传输速度会下降 byte buffer new byte 1024 8 使用的第三
  • MMEditing如何添加自己的新模型

    如何使用商汤的框架MMEditing添加一个自己的新模型嘞 因为自己平时做超分辨率 所以这里用BasicVSR的改动作为例子 一般需要在MMEditing中添加三个文件 配置 backbones以及restores BasicSR原始的地址
  • LeetCode-312.戳气球、动态规划

    有 n 个气球 编号为0 到 n 1 每个气球上都标有一个数字 这些数字存在数组 nums 中 现在要求你戳破所有的气球 如果你戳破气球 i 就可以获得 nums left nums i nums right 个硬币 这里的 left 和
  • C语言文件包含

    一个C语言程序由若干源程序文件组成 而一个源文件还可以将另一个源文件的全部内容包含进来 即将指定的源文件包含在当前文件中 例如 下有两个源文件file1 c和file2 c file1 c int max int x int y int z
  • 因易用性导致的TongWeb使用误区

    误区一 使用TongWeb企业版本 即按照 TongWeb7企业版用户手册 pdf 手册操作 安装好TongWeb后doc目录下有手册 TongWeb手册的正确观看顺序 1 最先看 TongWeb7快速使用手册 pdf 了解基本的安装 使用
  • 【基于用户的】协同过滤推荐算法(UserCF算法的实现)

    协同过滤算法在推荐算法领域应用十分广泛 主要有基于用户 UserCF 和基于物品 ItemCF 两种不同的类型 基于用户的推荐算法 它是一种发现兴趣相似的用户的算法 假如你正在建设的是一个学习资源共享平台 你的用户群体有着大致稳定的专业与相
  • JAVA烟花原理

    java烟花原理 0 缘由 两天前无聊玩了下蜘蛛纸牌 发现最后胜利时的烟花效果挺漂亮的 琢磨Java能不能弄出来类似的效果 上网搜了一下 整合资料 基本全是抄的 之后自己写了一份 重点讲原理 源码放文末 上一个效果图 1 概述 其实烟花说白
  • Springboot整合Mybatis(注解开发)

    前言 Springboot整合Mybatis实现一个最基本的增删改查功能 整合的方式有两种一种是注解形式的 也就是没有Mapper xml文件 还有一种是XML形式的 我推荐的是使用注解形式 为什么呢 因为更加的简介 减少不必要的错误 1
  • 基于TensorFlow的花卉识别

    概要设计 数据分析 本次设计的主题是花卉识别 数据为TensorFlow的官方数据集flower photos 包括5种花卉 雏菊 蒲公英 玫瑰 向日葵和郁金香 的图片 并有对应类别的标识 daisy dandelion roses sun
  • ChatGPT研究分析:GPT-4做了什么

    前脚刚研究了一轮GPT3 5 OpenAI很快就升级了GPT 4 整体表现有进一步提升 追赶一下潮流 研究研究GPT 4干了啥 本文内容全部源于对OpenAI公开的技术报告的解读 通篇以PR效果为主 实际内容不多 主要强调的工作 是 Pre
  • openwrt: Makefile 框架分析

    本篇的主要目的是想通过分析Makefile 了解openwrt编译过程 着重关注以下几点 openwrt目录结构 主Makefile的解析过程 各子目录的目标生成 kernel编译过程 firmware的生成过程 软件包的编译过程 open
  • sprintf错误以及类型转换

    最近 编写一个程序需要将两个字符串连接起来 我使用了sprintf函数 总是出现错误的结果 后来 把结果打印出来 才发现原来是char指针中有空字符 ASCII码为0的字符 我的错误代码如下 unsigned char szbuffer 1