记录最近在使用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的用法,才发现该函数实在是问题多多,使用需慎重、慎重……
记录最近在使用sprintf构造字符串时遇到的一个问题的更多相关文章
- springmvc 后台实体类接受前端json字符串时,其中一个属性content 接受富文本内容时 标签<p>、<span> 这些标签丢失问题解决
问题描述: 前端一个字段 <script id="editor" type="text/plain" name="content" s ...
- js中构造字符串若放入Grails中gsp的<g:link>标签出错
Grails的ajax使用json格式返回,在js中构造字符串时若放入<g:link>标签,字符串构造就会错误 如下就会发生错误,导致回调函数无法执行 function show(obj) ...
- 此类目的是防治序列化Json字符串时的循环引用问题-------最好解决方案
http://james.newtonking.com/json/help/index.html using Newtonsoft.Json;using System;using System.Col ...
- 将数据转化成字符串时:用字符串的链接 还是 StringBuilder
/* 目的:将数据转化成字符串时:用字符串的链接 还是 StringBuilder呢? */ public class Test{ public static void main(String[] a ...
- java操作字符串,重点是记录一次使用replaceAll对字符串的操作
符串常用操作(String类) 字符串查找 String提供了两种查找字符串的方法,即indexOf与lastIndexOf方法. 1.indexOf(String s) 该方法用于返回参数字符串s在 ...
- C#反序列化json字符串时,提示:应为来自命名空间“”的元素“root”。。遇到名称为“”、命名空间为“”的“None”。
反序列化调用接口返回的字符串时,出现:应为来自命名空间“”的元素“root”..遇到名称为“”.命名空间为“”的“None”.,导致反序列化数据失败,这种失败并有时候并不会直接提示反序列化失败(抛异常 ...
- java.text.MessageFormat格式化字符串时的小技巧
java.text.MessageFormat格式化字符串时的小技巧 public static void main(String[] args) throws InterruptedExceptio ...
- fastjson中对象转化为字符串时过滤某字段
fastjson中对象转化为字符串时过滤某字段,有两种方法: 一.在该字符定义上方添加"@JSONField(serialize=false)"注解: 二.调用含有Property ...
- Newtonsoft.Json 转换DateTime类型为字符串时,串内部会有一个T。解决方案
使用Newtonsoft.Json 转换DateTime类型时,若使用标准转换,则字符串内会有一个T(虽然再转换成DateTime没有问题). 若要转换成DateTime没有T,可以加上特性: pub ...
随机推荐
- C#中的Params、ref、out的区别
C# Params params params 关键字可以指定在参数数目可变处采用参数的方法参数. 在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params ...
- oracle_安装_win7+64位+Oracle+11g+64位下使用PLSQL+Developer+的解决办法
1)安装Oracle 11g 64位 2)安装32位的Oracle客户端( instantclient-basic-win32-11.2.0.1.0) 下载instantclient-basic-wi ...
- ReactJs入门思路
ReactJs入门思路小指南 原文 http://segmentfault.com/blog/fakefish/1190000002449277 React是怎么搞的? React中,把一切东西都看 ...
- Appium键盘操作
方法1 AppiumDriver实现了在上述功能,代码如下(java版本) driver.sendKeyEvent(66);方法2 HashMap<String, Integer> key ...
- [Android]Parcelable encountered IOException writing serializable object (name = xxx)
Activity之间通过Intent传递值,支持基本数据类型和String对象及它们的数组对象byte.byte[].char.char[].boolean.boolean[].short.short ...
- Redis 3.0集群搭建/配置/FAQ
·声明 1,已官网中文教程为基础,边看边学,结合环境现状搭建. 2,哥对Ruby不热爱.不熟悉.不感冒,所述内容如有疑义请谅解. 3,3.0官说集群还在测试中,其实用用也还算马马虎虎,对外集群API真 ...
- windows tcp端口映射或端口转发
windows tcp端口映射或端口转发 windows内部有一个叫netsh的玩意,可以把tcp端口进行映射或转发,可惜不支持udp.举个例子:一台windows有一个80端口,对外可以访问.另有一 ...
- 分析Java因为语言慢
Java在早期的(例JDK1.2一旦)这是很慢.也许是因为有很多的优化,以提高装置的版本号,Java这是越来越快,所以这是现在非常的Java和C/C++什么什么慢速争议. 我想我自己的理解.谈论的影响 ...
- .net的页面在大并发下出现503错误
.net的页面在大并发下偶尔出现503错误 我们开发了一个回调页面,由一个工具负责调用,由于压力非常大,回调页面通过6台服务器负载均衡的: 最近业务系统又再次扩容,回调页面压力成倍增加,在高峰时间段偶 ...
- MSSQL2008数据库备份还原和数据恢复
原文:MSSQL2008数据库备份还原和数据恢复 序言 一直想写一篇关于数据库备份与恢复的文章,但基于能力的有限对数据库认知的有限怕不足以准确的表达,最后思考很久还是决定把自己的一些理解写出来供大 ...