记录最近在使用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 ...
随机推荐
- HDU 2070 Fibbonacci Number
Fibbonacci Number Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- [ 流行的网络框架 ] AFN & ASI
1.AFN & ASI(早已经停止更新,但现在许多公司也在使用.) AFNetWorking地址:https://github.com/AFNetworking/AFNetworking AS ...
- T4模板生成不同部署环境下的配置文件
使用T4模板生成不同部署环境下的配置文件 在开发企业级应用的时候,通常会有不同的开发环境,比如有开发环境,测试环境,正式环境,生产环境等.在一份代码部署到不同环境的时候,不同环境的配置文件可能需要根据 ...
- Ubuntu 14.04 编译newLISP 10.6.0
1. 确保安装了gcc4.8.2 2. 安装须要的库: apt-get install libreadline6 libreadline6-dev 3. 下载并解压newLISP源码,这个不多说了,去 ...
- Object-C 基础学习笔记(for,foreach,while,switch)
int main(int argc, const char * argv[]) { //for,foreach,while,do-while,switch NSMutableArray* mutabl ...
- 使用SoapUI 测试Web Service
原文:使用SoapUI 测试Web Service 如何测试写好的Webservice?你当然可以写代码来测试,但还是太麻烦,你得花时间去学习各语言的关于Webservice调用的相关API.这里推荐 ...
- 三个创建WebStorm项目的方法
WebStorm项目代表一个完整的解决方案和定义项目范围设置.而重点则是代码完成.代码重构.代码风格等. 因此在建立项目时,WebStorm可以通过三个方面来完成:下载远程项目.复制控制存储库项目和直 ...
- ECharts图表系统 特性总览
最近在玩ECharts,感觉真心不错,在这里把官方的资料收集收集,给大家推荐一下下~ Architecture ECharts (Enterprise Charts 商业产品图表库) 提供商业产品常用 ...
- 【c#操作office】--OleDbDataAdapter 与OleDbDataReader方式读取excel,并转换为datatable
OleDbDataAdapter方式: /// <summary> /// 读取excel的表格放到DataTable中 ---OleDbDataAdapter /// </summ ...
- Spring Resource之作为依赖的资源
如果一个bean自己能够通过一些动态的过程来决定和提供一些资源路径,那么通过ResourceLoader接口来加载资源会是更有效的.考虑作为一个例子的加载模板,需要的指定的资源取决于用户的角色.如果资 ...