自适应 sprintf源码

合集下载

sprintf函数的用法

sprintf函数的用法

sprintf函数的用法Sprint函数是C语言中最常用的字符串格式化函数,它把可变个参数列表中的参数格式化输出到指定字符串中。

它主要有以下四种形式:1、sprintf(string,format[,argument]…string:字符串指针,指向用于存储格式化字符串的字符数组;格式format:控制输出格式的字符串常量,其中包含了一些转换说明符;argument:可以有一个或多个可变参数,它们将按照format字符串中的说明符格式化,然后加入到字符串string中。

2、sprintf_s(string,numberOfElements,format[,argument]… string:字符串指针,指向用于存储格式化字符串的字符数组; numberOfElements:表示string指向的字符数组的最大长度;格式format:控制输出格式的字符串常量,其中包含了一些转换说明符;argument:可以有一个或多个可变参数,它们将按照format字符串中的说明符格式化,然后加入到字符串string中。

3、sprintf_s_l(string,numberOfElements,locale,format[,argument ]…string:字符串指针,指向用于存储格式化字符串的字符数组; numberOfElements:表示string指向的字符数组的最大长度;locale:指定用于格式化输出的区域设置;格式format:控制输出格式的字符串常量,其中包含了一些转换说明符;argument:可以有一个或多个可变参数,它们将按照format字符串中的说明符格式化,然后加入到字符串string中。

4、vsprintf(string,format[,argument]…string:字符串指针,指向用于存储格式化字符串的字符数组;格式format:控制输出格式的字符串常量,其中包含了一些转换说明符;argument:可以有一个或多个可变参数,它们将按照format字符串中的说明符格式化,然后加入到字符串string中。

flex 源码 编译

flex 源码 编译

Flex源码的编译过程大致如下:导入Flex源码。

右键点击项目,选择属性,在Flex库编译器中设置附加的编译器参数,例如:-source-path=../locale/zh_CN。

在Flex 库构建路径中添加SWC文件夹,选择zh_CN文件夹。

右键单击项目,选择构建项目。

如果编译通过,在bin目录下会生成swc文件。

将生成的FlexPaper.swc文件复制到项目SRC文件夹下的lib文件夹下。

右键点击项目,选择属性,在Flex构建路径中添加以下两个引用:Zh_CN文件夹和
FlexPaper.swc文件。

在Flex编译器中设置附加的编译器参数:-locale zh_CN -source-path=locale/{locale}
-keep-all-type-selectors=true。

在项目的根目录下添加local文件夹(直接复制前面用到的库项目中的local文件夹)。

完成编译后即可运行。

sprintf函数的用法

sprintf函数的用法

由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。

这也导致sprintf 比printf 有用得多。

所以本文着重介绍sprintf,有时也穿插着用用pritnf。

sprintf 是个变参函数,定义如下:int sprintf( char *buffer, const char *format [, argument] ... );除了前两个参数类型固定外,后面可以接任意多个参数。

而它的精华,显然就在第二个参数:格式化字符串上。

printf 和sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。

格式化数字字符串sprintf 最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf 在大多数场合可以替代itoa。

如://把整数123 打印成一个字符串保存在s 中。

sprintf(s, "%d", 123); //产生"123"可以指定宽度,不足的左边补空格:sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"当然也可以左对齐:sprintf(s, "%­8d%8d", 123, 4567); //产生:"123 4567"也可以按照16 进制打印:sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐sprintf(s, "%­8X", 4568); //大写16 进制,宽度占8 个位置,左对齐这样,一个整数的16 进制字符串就很容易得到,但我们在打印16 进制内容时,通常想要一种左边补0 的等宽格式,那该怎么做呢?很简单,在表示宽度的数字前面加个0 就可以了。

sprintf函数

sprintf函数

sprintf函数sprintf函数是C/C++中一种常用的输出函数,它的主要功能是将格式化的数据以字符串的形式存储在指定的字符串变量中。

它可以用于将数字、字符串、字符等格式化输出到字符串缓冲区中。

sprintf函数的函数原型如下所示:int sprintf(char * str,const char * format,...);函数的参数str是字符指针,指向一个字符数组,用来存放格式化后的字符串。

format参数指定了输出格式,可以通过它格式化输出,其后的...表示format字符串中指定的参数。

sprintf函数实质上是一个格式化输出函数,可以在程序中将一系列字符、数字等元素,根据指定的格式,格式化输出到内存中的一个字符数组中。

举个例子,假定有如下变量:int i=1;float f=1; char str[]=hello world“; sprintf(buf,“i=%d,f=%f,str=%s n”,i,f,str);这段代码将变量i,f和str格式化输出到buf字符数组中,字符串格式为“i=1,f=1.000000,str=hello world n”。

由于sprintf函数可以将一系列数据格式化输出到字符数组中,因此常常被应用到日志输出和程序报错信息中。

sprintf函数还有一个重载形式:int sprintf(char * str,const char * format,va_list arg);通过这种重载形式,可以将可变参数传递到函数中,实现可变参数的格式化输出。

需要注意的是,sprintf函数一般不检查字符数组str是否会溢出,因此程序员应该在使用sprintf函数时充分考虑这个问题,以免程序出现未知错误或数据溢出。

另外,在Windows系统中,还有一个实现类似功能的函数:int wsprintf(char * str,const wchar_t * format,...);它的功能与sprintf函数类似,但其输出的字符串是Unicode编码的字符串,因此在Windows环境中使用更加方便。

sprintf函数

sprintf函数

sprintf函数sprintf函数是C语言中的一个重要的函数,它可以将格式化的字符串及数据储存在指定的内存空间中,它的功能强大、功能十分的实用。

本文将介绍其原理及用法,帮助读者更好的理解认识sprintf 函数。

sprintf函数其实是C中的一个格式化输出函数,它主要用来处理C语言字符串操作,是一个函数库函数,可以实现将字符串、数字、字符和结构体数据根据一定的格式,输出到一个缓冲区或者字符串中去。

sprintf函数的语法如下:int sprintf(char *str, const char *format, ...);其中str是传出参数,指向字符型指针,用于保存格式化字符串;format是传入参数,是指定格式化字符串,此参数的类型为const char;而点号后的参数与format参数不同,它是变量参数,用于将格式化字符串中的每一个格式化符号对应替换成对应类型的内容。

sprintf函数返回值是写入字符串str中的字节数,也就是写入字符串的长度。

sprintf函数的格式化控制主要采用的是sprintf函数的格式化符号,它们可以控制输出的格式,如控制字符的宽度,控制数据的形式,控制前缀等。

常使用的格式化控制如下:%d:表示允许整数参数;%ld:表示允许长整数参数;%f:表示允许浮点数参数;%s:表示允许字符串参数;%c:表示允许字符参数;%x:表示允许16进制整数参数;除此之外,sprintf函数还允许程序员使用定界符,即增加补充格式化控制符,该格式为“%[flags][width][.precision]specifier”,其中flags表示格式化控制参数,width表示宽度,precision表示精度,specifier表示数据类型。

sprintf函数的实例一般如下所示。

int ret;char buf[50];ret = sprintf(buf, 这是一个整数 %d,这是一个字符串 %s。

关于php的sprintf函数的用法控制浮点数格式

关于php的sprintf函数的用法控制浮点数格式

关于php的sprintf函数的用法控制浮点数格式
控制浮点数打印格式
浮点数的打印和格式控制是sprintf的一大常用功能,浮点数使用格式符”%f”控制,默认保留小数点后6位数字,比如:复制代码代码如下:
sprintf("%f",3.1415926);//结果:"3.141593"
但,有时我们希望自己控制打印的宽度和小数位数,这时就应该使用:”%m.nf”格式,其中m表示打印数字的整体宽度,n表示小数点后的位数。

比如:
复制代码代码如下:
sprintf("%9.3f",3.1415926);//右对齐:位数不够用空格补全。

结果:"3.142"
sprintf("%-9.3f",3.1415926);//左对齐:位数不够用空格补全。

结果:"3.142"
sprintf("%.3f",3.1415926);//不指定总宽度,结果:"3.142"
注意一个问题
复制代码代码如下:
$num=100;
sprintf("%.2f",$num);
sprintf("%.2f",(double)$num);
上面的两个结果真的一样吗?虽然看起来是一样的,但是下面的原因,可能会有所启发.
原因是:参数压栈时调用者并不知道跟num相对应的格式控制符是个”%f”。

而函数执行时函数本身则并不知道当年被压入栈里的是个整数,于是可怜的保存整数$num的那4个字节就被不由分说地强行作为浮点数格式来解释了,整个乱套了。

sprintf函数php的详细使用方法

sprintf函数php的详细使用方法

sprintf函数php的详细使⽤⽅法PHP sprintf() 函数先说下为什么要写这个函数的前⾔,这个是我在微信⼆次开发的⼀个token验证⽂档也就是⽰例⽂档看到的⼀个函数,当时⾮常不理解,于是查了百度,但是很多结果都很笼统,结果也很少,后来查阅了3c和问了公司的⼀些⼈做了⼀些测试慢慢懂了⼀些,⼀下就是我对sprintf函数的个⼈见解⽤处:把字符串进⾏多种类型的格式化⽤于:处理xml数据格式时,需要⽤到他来格式化等等基本语法格式:sprintf("%格式化类型","$str1","$str2") ;先别急我会⼀个个慢慢说先看⼀下类型参照表,也就是要转换成什么类型的格式这是转换格式的类型参照表先举个最简单的案例<?php$str1="1234";echo sprintf("hello%s","$str1");//效果为: hello1234>这什么意思呢要点:%s = %符号和后⾯属性符号(s)总称为插⼊标记组合,也就是把后⾯准备进⾏格式化的值($str1)替换在这个位置hello = 这个单词就是很多⼈蒙蔽的地⽅,告诉你这个什么代表也没有,就单纯的代表⼀个hello,⽤于分割或者修饰⽤,⼀般⽤[ %s ]、<%s>这样格式化出来后就直接在标签⾥记住,⼀个%标记符后⾯只有⼀个类型属性(⽐如s),s是什么上⾯有,以字符串的⽅式格式化那么多个值怎么格式化⼀起呢看<?php$a="abcdef";$b="abcdef";$c="1234";echo sprintf("%1\$s%2\$s",$c,$a);//效果为: 1234abcdef>%s为⼀个标记,两个%s%s这样写却是错误的,每个%s必须标记键位,不然我怎么知道都代表格式化后⾯的哪个$str呢,所以有个特别的语法%1\$%2\$ 解释:%1表⽰格式化sprintf("%1\$%2\$",''$str1","$str2")中对应的$str1,那么%2⾃然表⽰格式化$str2,\$是代表有多个值准备格式化,所以每个%1和%2或者还有%3的标记后都要加这个符号代表⼀⾏中有多个标记,如果只有⼀个标记就不⽤\$了占位符了,记住$str2、$str3是可选,也就是可以不格式化这么多讲个特殊的例⼦<?php$a="abcdef";$b="abcdef";$c="1234";echo sprintf("%'x13.2f",$c);// 效果为:xxxxxx1234.00//echo sprintf("%06.2f", $a);>sprintf("%'x13.2f",$c);这是什么意思,f是浮点数,第⼀步按照格式% '(补位值)宽度值格式化类型这三部分,语法之间必须紧挨着不能⽤空格必须解释⼀下何为补位值:就是设定的宽度超出了,⽤这个值来填上解释⼀下,补位值只有设置宽度超出了⽬标值才能⽤所以就是⽤x补位,13为总宽度,2为⼩数点后的宽度,f为格式化类型,别急我会解释' 号(单引号)代表接下来要⽤补位类型为什么他能识别x是补位值呢,因为前⾯有'号,为什么他能识别哪⼏位是哪种类型呢,他是这样识别的,按顺序从先从两头的字符开始识别是什么类型,补位值肯定是单数位,不可能⼀个位置补两个数吧,所以左边第⼀位x是补位值,右边第⼀位是格式化类型,然后中间的⾃然是宽度值第⼆,为什么⼩数点后还有⼀个属性,因为这是f(浮点型),必须设置⼩数点后有⼏位,不能⼩数后⾯不能设置了吧,那浮点数意义何在呢不要觉得烦,每个例⼦都是浓缩出来的整数补位<?php$a="abcdef";$b="abcdef";$c="1234";echo sprintf("%'07s",$c);//结果是:0001234>这就是整数补位,还是⼀样第⼀步按照格式% '(补位值)宽度值格式化类型这三部分0是补位值 7是宽度值 s⾃然是格式化类型还有⼀种最重要的例⼦<?php$a="abcdef";$b="abcdef";$c="1234";echo sprintf("[%-6s]",$c); //结果是:[1234 ]echo sprintf("[%-4s]",$c); //结果是:[1234]echo sprintf("[%4.2s]",$c); //结果是:[ 12]>这个第⼀步 [ ] 仅仅只是修饰,不⽤理解第⼆步,没有 '号,证明没有补位,⽆需添加补位值所以语法格式为:% 宽度值格式化类型这两部分第⼀⼆⾏解释如下:第⼀个宽度为6,但是$c=1234 ,只有4个字符,所以宽度不够,所以右边⾃动扩充(扩充再多也只显⽰⼀个空格位置),为什么在右边扩充,因为宽度前有个 - 号,代表补位⽅向相反,如在补位值前加-,⾃然从右边开始补位下⾯为什么没变化,因为宽度正好⼀致,只是补位的⽅向改变了第三⾏解释如下:不要被蒙蔽了,语法结构还是⼀样% 宽度值格式化类型这两部分没有 ' 号,证明没有补位,⽆需添加补位值所以4.2依旧是宽度值只是⼩数点左边的4代表总宽度,右边的2代表只显⽰2位出来,所以⼜空缺了两个,所以左边开始扩充两个空位,为什么只显⽰⼀个空格上⼀段说了,再说⼀次吧扩充再多也只显⽰⼀个空格位置。

自适应 sprintf源码

自适应 sprintf源码
#ifndef __va_rounded_size
#define __va_rounded_size(TYPE) (((sizeof(TYPE)+sizeof(int)-1)/sizeof(int))*sizeof(int))
#endif
#ifndef va_start
#define va_start(AP, LASTARG) (AP = ((char *)&amp; (LASTARG) + __va_rounded_size(LASTARG)))
const char *sc;
for (sc = s; *sc != &#39;/0&#39; &amp;&amp; count--; ++sc);
return sc - s;
}
static char * itoa(int n, char * chBuffer)
{
int i = 1;
char * pch = chBuffer;
if(!pch) return 0;
while(n / i) i *= 10;
if(n &lt; 0)
{
n = -n;
*pch++ = &#39;-&#39;;
}
if (0 == n) i = 10;
while(i /= 10)
{
{
sign = &#39;+&#39;;
size--;
}
else if (type &amp; SPACE)
{
sign = &#39; &#39;;

c语言sprintf函数

c语言sprintf函数

sprintf字串格式化命令,主要功能是把格式化的数据写入某个字符串中。

sprintf 是个变参函数,使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访问错误,但好在由sprintf 误用导致的问题虽然严重,却很容易找出,无非就是那么几种情况,通常用眼睛再把出错的代码多看几眼就看出来了。

函数简介:函数功能:把格式化的数据写入某个字符串头文件:stdio.h函数原型:int sprintf( char *buffer, const char *format [, argument] … );返回值:字符串长度(strlen)相关函数:[1]int sprintf_s(char *buffer,size_t sizeOfBuffer,const char*format [,argument] ... );int _sprintf_s_l(char *buffer,size_t sizeOfBuffer,const char *format,locale_t locale [,argument] ... );int swprintf_s(wchar_t *buffer,size_t sizeOfBuffer,const wchar_t *format [,argument]...);int _swprintf_s_l(wchar_t *buffer,size_t sizeOfBuffer,const wchar_t *format,locale_t locale [,argument]…);template <size_t size>int sprintf_s(char (&buffer)[size],const char *format[,argument] ... ); // C++ onlytemplate <size_t size>int swprintf_s(wchar_t (&buffer)[size],const wchar_t *format [,argument]...); // C++ only参数说明及应用举例:sprintf格式的规格如下所示。

遗传算法Matlab源代码

遗传算法Matlab源代码

遗传算法Matlab源代码完整可以运行的数值优化遗传算法源代码function[X,MaxFval,BestPop,Trace]=fga(FUN,bounds,MaxEranum,PopSiz e,options,pCross,pMutation,pInversion)%[X,MaxFval,BestPop,Trace]=fga(FUN,bounds,MaxEranum,PopSiz e,options,pCross,pMutation,pInversion)% Finds a maximum of a function of several variables.% fga solves problems of the form:% max F(X) subject to: LB = X = UB (LB=bounds(:,1),UB=bounds(:,2))% X - 最优个体对应自变量值% MaxFval - 最优个体对应函数值% BestPop - 最优的群体即为最优的染色体群% Trace - 每代最佳个体所对应的目标函数值% FUN - 目标函数% bounds - 自变量范围% MaxEranum - 种群的代数,取50--500(默认200)% PopSize - 每一代种群的规模;此可取50--200(默认100)% pCross - 交叉概率,一般取0.5--0.85之间较好(默认0.8)% pMutation - 初始变异概率,一般取0.05-0.2之间较好(默认0.1)% pInversion - 倒位概率,一般取0.05-0.3之间较好(默认0.2) % options - 1*2矩阵,options(1)=0二进制编码(默认0),option(1)~=0十进制编码,option(2)设定求解精度(默认1e-4)T1=clock;%检验初始参数if nargin2, error('FMAXGA requires at least three input arguments'); endif nargin==2, MaxEranum=150;PopSize=100;options=[1 1e-4];pCross=0.85;pMutation=0.1;pInversion=0.25;endif nargin==3, PopSize=100;options=[1 1e-4];pCross=0.85;pMutation=0.1;pInversion=0.25;endif nargin==4, options=[1 1e-4];pCross=0.85;pMutation=0.1;pInversion=0.25;endif nargin==5, pCross=0.85;pMutation=0.1;pInversion=0.25;endif nargin==6, pMutation=0.1;pInversion=0.25;endif nargin==7, pInversion=0.25;endif (options(1)==0|options(1)==1)find((bounds(:,1)-bounds(:,2))0)error('数据输入错误,请重新输入:');end% 定义全局变量global m n NewPop children1 children2 VarNum% 初始化种群和变量precision = options(2);bits = ceil(log2((bounds(:,2)-bounds(:,1))' ./ precision));%由设定精度划分区间VarNum = size(bounds,1);[Pop] = InitPop(PopSize,bounds,bits,options);%初始化种群[m,n] = size(Pop);fit = zeros(1,m);NewPop = zeros(m,n);children1 = zeros(1,n);children2 = zeros(1,n);pm0 = pMutation;BestPop = zeros(MaxEranum,n);%分配初始解空间BestPop,TraceTrace = zeros(1,MaxEranum);完整可以运行的数值优化遗传算法源代码Lb = ones(PopSize,1)*bounds(:,1)';Ub = ones(PopSize,1)*bounds(:,2)';%二进制编码采用多点交叉和均匀交叉,并逐步增大均匀交叉概率%浮点编码采用离散交叉(前期)、算术交叉(中期)、AEA重组(后期)OptsCrossOver = [ones(1,MaxEranum)*options(1);...round(unidrnd(2*(MaxEranum-[1:MaxEranum]))/MaxEranum)]';%浮点编码时采用两种自适应变异和一种随机变异(自适应变异发生概率为随机变异发生的2倍)OptsMutation = [ones(1,MaxEranum)*options(1);unidrnd(5,1,MaxEranum)]';if options(1)==3D=zeros(n);CityPosition=bounds;D = sqrt((CityPosition(:, ones(1,n)) - CityPosition(:, ones(1,n))').^2 +...(CityPosition(:,2*ones(1,n)) - CityPosition(:,2*ones(1,n))').^2 );end%========================================================================== % 进化主程序%%===================================== ===================================== eranum = 1;H=waitbar(0,'Please wait...');while(eranum=MaxEranum)for j=1:mif options(1)==1%eval(['[fit(j)]=' FUN '(Pop(j,:));']);%但执行字符串速度比直接计算函数值慢fit(j)=feval(FUN,Pop(j,:));%计算适应度elseif options(1)==0%eval(['[fit(j)]=' FUN '(b2f(Pop(j,:),bounds,bits));']);fit(j)=feval(FUN,(b2f(Pop(j,:),bounds,bits)));elsefit(j)=-feval(FUN,Pop(j,:),D);endend[Maxfit,fitIn]=max(fit);%得到每一代最大适应值Meanfit(eranum)=mean(fit);BestPop(eranum,:)=Pop(fitIn,:);Trace(eranum)=Maxfit;if options(1)==1Pop=(Pop-Lb)./(Ub-Lb);%将定义域映射到[0,1]:[Lb,Ub]--[0,1] ,Pop--(Pop-Lb)./(Ub-Lb)endswitch round(unifrnd(0,eranum/MaxEranum))%进化前期尽量使用实行锦标赛选择,后期逐步增大非线性排名选择case {0} [selectpop]=TournamentSelect(Pop,fit,bits);%锦标赛选择case {1}[selectpop]=NonlinearRankSelect(Pop,fit,bits);%非线性排名选择end完整可以运行的数值优化遗传算法源代码[CrossOverPop]=CrossOver(selectpop,pCross,OptsCrossOver(er anum,:));%交叉[MutationPop]=Mutation(CrossOverPop,fit,pMutation,VarNum,O ptsMutation(eranum,:)); %变异[InversionPop]=Inversion(MutationPop,pInversion);%倒位%更新种群if options(1)==1Pop=Lb+InversionPop.*(Ub-Lb);%还原PopelsePop=InversionPop;endpMutation=pm0+(eranum^3)*(pCross/2-pm0)/(eranum^4); %逐步增大变异率至1/2交叉率percent=num2str(round(100*eranum/MaxEranum));waitbar(eranum/MaxEranum,H,['Evolution complete ',percent,'%']);eranum=eranum+1;endclose(H);% 格式化输出进化结果和解的变化情况t=1:MaxEranum;plot(t,Trace,t,Meanfit);legend('解的变化','种群的变化');title('函数优化的遗传算法');xlabel('进化世代数');ylabel('每一代最优适应度');[MaxFval,MaxFvalIn]=max(Trace);if options(1)==1|options(1)==3X=BestPop(MaxFvalIn,:);elseif options(1)==0X=b2f(BestPop(MaxFvalIn,:),bounds,bits);endhold on;plot(MaxFvalIn,MaxFval,'*');text(MaxFvalIn+5,MaxFval,['FMAX=' num2str(MaxFval)]);str1=sprintf(' Best generation:\n %d\n\n Best X:\n %s\n\n MaxFval\n %f\n',...MaxFvalIn,num2str(X),MaxFval);disp(str1);% -计时T2=clock;elapsed_time=T2-T1;if elapsed_time(6)0elapsed_time(6)=elapsed_time(6)+60;elapsed_time(5)=elapsed_time(5)-1;endif elapsed_time(5)0elapsed_time(5)=elapsed_time(5)+60;elapsed_time(4)=elapsed_t ime(4)-1;end完整可以运行的数值优化遗传算法源代码str2=sprintf('elapsed_time\n %d (h) %d (m) %.4f (s)',elapsed_time(4),elapsed_time(5),elapsed_time(6));disp(str2);%===================================== ===================================== % 遗传操作子程序%%===================================== ===================================== % -- 初始化种群--% 采用浮点编码和二进制Gray编码(为了克服二进制编码的Hamming悬崖缺点)function [initpop]=InitPop(popsize,bounds,bits,options)numVars=size(bounds,1);%变量数目rang=(bounds(:,2)-bounds(:,1))';%变量范围if options(1)==1initpop=zeros(popsize,numVars);initpop=(ones(popsize,1)*rang).*(rand(popsize,numVars))+(ones (popsize,1)*bounds(:,1)');elseif options(1)==0precision=options(2);%由求解精度确定二进制编码长度len=sum(bits);initpop=zeros(popsize,len);%The whole zero encoding individualfor i=2:popsize-1pop=round(rand(1,len));pop=mod(([0 pop]+[pop 0]),2);%i=1时,b(1)=a(1);i1时,b(i)=mod(a(i-1)+a(i),2)%其中原二进制串:a(1)a(2)...a(n),Gray串:b(1)b(2)...b(n)initpop(i,:)=pop(1:end-1);endinitpop(popsize,:)=ones(1,len);%The whole one encoding individualelsefor i=1:popsizeinitpop(i,:)=randperm(numVars);%为Tsp问题初始化种群endend% -- 二进制串解码--function [fval] = b2f(bval,bounds,bits)% fval - 表征各变量的十进制数% bval - 表征各变量的二进制编码串% bounds - 各变量的取值范围% bits - 各变量的二进制编码长度scale=(bounds(:,2)-bounds(:,1))'./(2.^bits-1); %The range of the variablesnumV=size(bounds,1);cs=[0 cumsum(bits)];for i=1:numVa=bval((cs(i)+1):cs(i+1));fval(i)=sum(2.^(size(a,2)-1:-1:0).*a)*scale(i)+bounds(i,1);end% -- 选择操作--完整可以运行的数值优化遗传算法源代码% 采用基于轮盘赌法的非线性排名选择% 各个体成员按适应值从大到小分配选择概率:% P(i)=(q/1-(1-q)^n)*(1-q)^i, 其中P(0)P(1)...P(n), sum(P(i))=1function [NewPop]=NonlinearRankSelect(OldPop,fit,bits) global m n NewPopfit=fit';selectprob=fit/sum(fit);%计算各个体相对适应度(0,1)q=max(selectprob);%选择最优的概率x=zeros(m,2);x(:,1)=[m:-1:1]';[y x(:,2)]=sort(selectprob);r=q/(1-(1-q)^m);%标准分布基值newfit(x(:,2))=r*(1-q).^(x(:,1)-1);%生成选择概率newfit=[0 cumsum(newfit)];%计算各选择概率之和rNums=rand(m,1);newIn=1;while(newIn=m)NewPop(newIn,:)=OldPop(length(find(rNums(newIn)newfit)),:);newIn=newIn+1;end% -- 锦标赛选择(含精英选择) --function [NewPop]=TournamentSelect(OldPop,fit,bits)global m n NewPopnum=floor(m./2.^(1:10));num(find(num==0))=[];L=length(num);a=sum(num);b=m-a;PopIn=1;while(PopIn=L)r=unidrnd(m,num(PopIn),2^PopIn);[LocalMaxfit,In]=max(fit(r),[],2);SelectIn=r((In-1)*num(PopIn)+[1:num(PopIn)]');NewPop(sum(num(1:PopIn))-num(PopIn)+1:sum(num(1:PopIn)),:)=OldPop(SelectIn,:);PopIn=PopIn+1;r=[];In=[];LocalMaxfit=[];endif b1NewPop((sum(num)+1):(sum(num)+b-1),:)=OldPop(unidrnd(m,1,b-1),:);end[GlobalMaxfit,I]=max(fit);%保留每一代中最佳个体NewPop(end,:)=OldPop(I,:);% -- 交叉操作--function [NewPop]=CrossOver(OldPop,pCross,opts)global m n NewPopr=rand(1,m);完整可以运行的数值优化遗传算法源代码y1=find(rpCross);y2=find(r=pCross);len=length(y1);if len==1|(len2mod(len,2)==1)%如果用来进行交叉的染色体的条数为奇数,将其调整为偶数y2(length(y2)+1)=y1(len);y1(len)=[];endi=0;if length(y1)=2if opts(1)==1%浮点编码交叉while(i=length(y1)-2)NewPop(y1(i+1),:)=OldPop(y1(i+1),:);NewPop(y1(i+2),:)=OldPop(y1(i+2),:);if opts(2)==0n1%discret crossoverPoints=sort(unidrnd(n,1,2));NewPop(y1(i+1),Points(1):Points(2))=OldPop(y1(i+2),Points(1):Po ints(2));NewPop(y1(i+2),Points(1):Points(2))=OldPop(y1(i+1),Points(1):Po ints(2));elseif opts(2)==1%arithmetical crossoverPoints=round(unifrnd(0,pCross,1,n));CrossPoints=find(Points==1);r=rand(1,length(CrossPoints));NewPop(y1(i+1),CrossPoints)=r.*OldPop(y1(i+1),CrossPoints)+(1 -r).*OldPop(y1(i+2),CrossPoints);NewPop(y1(i+2),CrossPoints)=r.*OldPop(y1(i+2),CrossPoints)+(1 -r).*OldPop(y1(i+1),CrossPoints); else %AEA recombination Points=round(unifrnd(0,pCross,1,n));CrossPoints=find(Points==1);v=unidrnd(4,1,2);NewPop(y1(i+1),CrossPoints)=(floor(10^v(1)*OldPop(y1(i+1),Cro ssPoints))+...10^v(1)*OldPop(y1(i+2),CrossPoints)-floor(10^v(1)*OldPop(y1(i+2),CrossPoints)))/10^v(1);NewPop(y1(i+2),CrossPoints)=(floor(10^v(2)*OldPop(y1(i+2),Cro ssPoints))+...10^v(2)*OldPop(y1(i+1),CrossPoints)-floor(10^v(2)*OldPop(y1(i+1),CrossPoints)))/10^v(2);endi=i+2;endelseif opts(1)==0%二进制编码交叉while(i=length(y1)-2)if opts(2)==0[NewPop(y1(i+1),:),NewPop(y1(i+2),:)]=EqualCrossOver(OldPop( y1(i+1),:),OldPop(y1(i+2),:)); else[NewPop(y1(i+1),:),NewPop(y1(i+2),:)]=MultiPointCross(OldPop( y1(i+1),:),OldPop(y1(i+2),:)); endi=i+2;endelse %Tsp问题次序杂交for i=0:2:length(y1)-2xPoints=sort(unidrnd(n,1,2));NewPop([y1(i+1)y1(i+2)],xPoints(1):xPoints(2))=OldPop([y1(i+2)y1(i+1)],xPoints(1):xPoints(2));完整可以运行的数值优化遗传算法源代码%NewPop(y1(i+2),xPoints(1):xPoints(2))=OldPop(y1(i+1),xPo ints(1):xPoints(2));temp=[OldPop(y1(i+1),xPoints(2)+1:n)OldPop(y1(i+1),1:xPoints(2))];for del1i=xPoints(1):xPoints(2)temp(find(temp==OldPop(y1(i+2),del1i)))=[];endNewPop(y1(i+1),(xPoints(2)+1):n)=temp(1:(n-xPoints(2)));NewPop(y1(i+1),1:(xPoints(1)-1))=temp((n-xPoints(2)+1):end);temp=[OldPop(y1(i+2),xPoints(2)+1:n)OldPop(y1(i+2),1:xPoints(2))];for del2i=xPoints(1):xPoints(2)temp(find(temp==OldPop(y1(i+1),del2i)))=[];endNewPop(y1(i+2),(xPoints(2)+1):n)=temp(1:(n-xPoints(2)));NewPop(y1(i+2),1:(xPoints(1)-1))=temp((n-xPoints(2)+1):end);endendendNewPop(y2,:)=OldPop(y2,:);% -二进制串均匀交叉算子function[children1,children2]=EqualCrossOver(parent1,parent2) global n children1 children2hidecode=round(rand(1,n));%随机生成掩码crossposition=find(hidecode==1);holdposition=find(hidecode==0);children1(crossposition)=parent1(crossposition);%掩码为1,父1为子1提供基因children1(holdposition)=parent2(holdposition);%掩码为0,父2为子1提供基因children2(crossposition)=parent2(crossposition);%掩码为1,父2为子2提供基因children2(holdposition)=parent1(holdposition);%掩码为0,父1为子2提供基因% -二进制串多点交叉算子function[Children1,Children2]=MultiPointCross(Parent1,Parent2)%交叉点数由变量数决定global n Children1 Children2 VarNumChildren1=Parent1;Children2=Parent2;Points=sort(unidrnd(n,1,2*VarNum));for i=1:VarNumChildren1(Points(2*i-1):Points(2*i))=Parent2(Points(2*i-1):Points(2*i));Children2(Points(2*i-1):Points(2*i))=Parent1(Points(2*i-1):Points(2*i));end% -- 变异操作--function[NewPop]=Mutation(OldPop,fit,pMutation,VarNum,opts) global m n NewPopNewPop=OldPop;r=rand(1,m);MutIn=find(r=pMutation);L=length(MutIn);完整可以运行的数值优化遗传算法源代码i=1;if opts(1)==1%浮点变异maxfit=max(fit);upfit=maxfit+0.05*abs(maxfit);if opts(2)==1|opts(2)==3while(i=L)%自适应变异(自增或自减)Point=unidrnd(n);T=(1-fit(MutIn(i))/upfit)^2;q=abs(1-rand^T);%if q1%按严格数学推理来说,这段程序是不能缺少的% q=1%endp=OldPop(MutIn(i),Point)*(1-q);if unidrnd(2)==1NewPop(MutIn(i),Point)=p+q;elseNewPop(MutIn(i),Point)=p;endi=i+1;endelseif opts(2)==2|opts(2)==4%AEA变异(任意变量的某一位变异)while(i=L)Point=unidrnd(n);T=(1-abs(upfit-fit(MutIn(i)))/upfit)^2;v=1+unidrnd(1+ceil(10*T));%v=1+unidrnd(5+ceil(10*eranum/MaxEranum));q=mod(floor(OldPop(MutIn(i),Point)*10^v),10);NewPop(MutIn(i),Point)=OldPop(MutIn(i),Point)-(q-unidrnd(9))/10^v;i=i+1;endelsewhile(i=L)Point=unidrnd(n);if round(rand)NewPop(MutIn(i),Point)=OldPop(MutIn(i),Point)*(1-rand);elseNewPop(MutIn(i),Point)=OldPop(MutIn(i),Point)+(1-OldPop(MutIn(i),Point))*rand; endi=i+1;endendelseif opts(1)==0%二进制串变异if L=1while i=Lk=unidrnd(n,1,VarNum); %设置变异点数(=变量数)for j=1:length(k)if NewPop(MutIn(i),k(j))==1NewPop(MutIn(i),k(j))=0;else完整可以运行的数值优化遗传算法源代码NewPop(MutIn(i),k(j))=1;endendi=i+1;endendelse%Tsp变异if opts(2)==1|opts(2)==2|opts(2)==3|opts(2)==4numMut=ceil(pMutation*m);r=unidrnd(m,numMut,2);[LocalMinfit,In]=min(fit(r),[],2);SelectIn=r((In-1)*numMut+[1:numMut]');while(i=numMut)mPoints=sort(unidrnd(n,1,2));if mPoints(1)~=mPoints(2)NewPop(SelectIn(i),1:mPoints(1)-1)=OldPop(SelectIn(i),1:mPoints(1)-1);NewPop(SelectIn(i),mPoints(1):mPoints(2)-1)=OldPop(SelectIn(i),mPoints(1)+1:mPoints(2));NewPop(SelectIn(i),mPoints(2))=OldPop(SelectIn(i),mPoints(1));NewPop(SelectIn(i),mPoints(2)+1:n)=OldPop(SelectIn(i),mPoints( 2)+1:n);elseNewPop(SelectIn(i),:)=OldPop(SelectIn(i),:);endi=i+1;endr=rand(1,m);MutIn=find(r=pMutation);L=length(MutIn);while i=LmPoints=sort(unidrnd(n,1,2));rIn=randperm(mPoints(2)-mPoints(1)+1);NewPop(MutIn(i),mPoints(1):mPoints(2))=OldPop(MutIn(i),mPoin ts(1)+rIn-1);i=i+1;endendend% -- 倒位操作--function [NewPop]=Inversion(OldPop,pInversion)global m n NewPopNewPop=OldPop;r=rand(1,m);PopIn=find(r=pInversion);len=length(PopIn);if len=1while(i=len)d=sort(unidrnd(n,1,2));完整可以运行的数值优化遗传算法源代码NewPop(PopIn(i),d(1):d(2))=OldPop(PopIn(i),d(2):-1:d(1)); i=i+1;。

sprintf函数详细介绍

sprintf函数详细介绍

sprintf函数:sprintf函数详细介绍疯狂代码 / ĵ:http://CDevelopment/Article13960.html在将各种类型数据构造成串时sprf强大功能很少会让你失望由于sprf跟prf在使用方法上几乎样只是打印目地区别而已前者打印到串中后者则直接在命令行上输出这也导致sprf比prf有用得多sprf是个变参定义如下:sprf(char*buffer,constchar*format[,argument]...);除了前两个参数类型固定外后面可以接任意多个参数而它精华显然就在第 2个参数:格式化串上prf和sprf都使用格式化串来指定串格式在格式串内部使用些以“%”开头格式介绍说明符(formatspecications)来占据个位置在后边变参列表中提供相应变量最终就会用相应位置变量来替代那个介绍说明符产生个者想要串格式化数字串sprf最常见应用的莫过于把整数打印到串中所以spritnf在大多数场合可以替代itoa如://把整数123打印成个串保存在s中sprf(s,\"%d\",123);//产生\"123\"可以指定宽度不足左边补空格:sprf(s,\"%8d%8d\",123,4567);//产生:\"1234567\"当然也可以左对齐:sprf(s,\"%-8d%8d\",123,4567);//产生:\"1234567\"也可以按照16进制打印:sprf(s,\"%8x\",4567);//小写16进制宽度占8个位置右对齐sprf(s,\"%-8X\",4568);//大写16进制宽度占8个位置左对齐这样个整数16进制串就很容易得到但我们在打印16进制内容时通常想要种左边补0等宽格式那该如何做呢?很简单在表示宽度数字前面加个0就可以了sprf(s,\"%08X\",4567);//产生:\"000011D7\"上面以”%d”进行10进制打印同样也可以使用这种左边补0方式这里要注意个符号扩展问题:比如假如我们想打印短整数()-1内存16进制表示形式在Win32平台上个型占2个字节所以我们自然希望用4个16进制数字来打印它:si=-1;sprf(s,\"%04X\",si);产生“FFFFFFFF”如何回事?spritnf是个变参除了前面两个参数的外后面参数都不是类型安全更没有办法仅仅通过个“%X”就能得知当初前参数压栈时被压进来到底是个4字节整数还是个2字节短整数所以采取了统4字节处理方式导致参数压栈时做了符号扩展扩展成了32位整数-1打印时4个位置不够了就把32位整数-18位16进制都打印出来了如果你想看si本来面目那么就应该让编译器做0扩展而不是符号扩展(扩展时 2进制左边补0而不是补符号位): sprf(s,\"%04X\",(unsigned)si);就可以了或者:unsignedsi=-1;sprf(s,\"%04X\",si);sprf和prf还可以按8进制打印整数串使用”%o”注意8进制和16进制都不会打 [Page]印出负数都是无符号实际上也就是变量内部编码直接16进制或8进制表示控制浮点数打印格式浮点数打印和格式控制是sprf又大常用功能浮点数使用格式符”%f”控制默认保留小数点后6位数字比如:sprf(s,\"%f\",3.1415926);//产生\"3.141593\"但有时我们希望自己控制打印宽度和小数位数这时就应该使用:”%m.nf”格式其中m表示打印宽度n表示小数点后位数比如:sprf(s,\"%10.3f\",3.1415626);//产生:\"3.142\"sprf(s,\"%-10.3f\",3.1415626);//产生:\"3.142\"sprf(s,\"%.3f\",3.1415626);//不指定总宽度产生:\"3.142\"注意个问题你猜i=100;sprf(s,\"%.2f\",i);会打出什么东东来?“100.00”?对吗?自己试试就知道了同时也试试下面这个:sprf(s,\"%.2f\",(double)i);第个打出来肯定不是正确结果原因跟前面提到样参数压栈时者并不知道跟i相对应格式控制符是个”%f”而执行时本身则并不知道当年被压入栈里是个整数于是可怜保存整数i那4个字节就被不由分说地强行作为浮点数格式来解释了整个乱套了不过如果有人有兴趣使用手工编码个浮点数那么倒可以使用这种思路方法来检验下你手工编排结果是否正确/Ascii码对照我们知道在C/C语言中char也是种普通scalable类型除了字长的外它和long这些类型没有本质区别只不过被大家习惯用来表示和串而已(或许当年该把这个类型叫做“”然后现在就可以根据实际情况使用或来把char通过typedef定义出来这样更合适些)于是使用”%d”或者”%x”打印个便能得出它10进制或16进制ASCII码;反过来使用”%c”打印个整数便可以看到它所对应ASCII以下段把所有可见ASCII码对照表打印到屏幕上(这里采用prf注意”#”和”%X”合用时自动为16进制数增加”0X”前缀):for(i=32;i<127;i){prf(\"[%c]:%3d0x%#04X\\n\",i,i,i);}连接串sprf格式控制串中既然可以插入各种东西并最终把它们“连成串”自然也就能够连接串从而在许多场合可以替代strcat但sprf能够次连接多个串(自然也可以同时在它们中间插入别内容总的非常灵活)比如:char*who=\"I\";char*whom=\"CSDN\";sprf(s,\"%slove%s.\",who,whom);//产生:\"IloveCSDN.\"strcat只能连接串(段以’’结尾或叫做缓冲null-terminated-)但有时我们有两段缓冲区他们并不是以’’结尾比如许多从第 3方库中返回从硬件或者网络传输中读进来流它们未必每段序列后面都有个相应’’来结尾如果直接连接不管是sprf还是strcat肯定会导致非法内存操作而strncat也至少要求第个参数是个null-terminated-那该如何办呢?我们自然会想起前面介绍打印整数和浮点数时可以指定宽度串也样比如: [Page]chara1={’A’,’B’,’C’,’D’,’E’,’F’,’G’};chara2={’H’,’I’,’J’,’K’,’L’,’M’,’N’};如果:sprf(s,\"%s%s\",a1,a2);//Don’tdothat!十有 8 9要出问题了是否可以改成:sprf(s,\"%7s%7s\",a1,a2);也没好到哪儿去正确应该是:sprf(s,\"%.7s%.7s\",a1,a2);//产生:\"ABCDEFGHIJKLMN\"这可以类比打印浮点数”%m.nf”在”%m.ns”中m表示占用宽度(串长度不足时补空格超出了则按照实际宽度打印)n才表示从相应串中最多取用数通常在打印串时m没什么大用还是点号后面n用多自然也可以前后都只取部分:sprf(s,\"%.6s%.5s\",a1,a2);//产生:\"ABCDEFHIJKL\"在许多时候我们或许还希望这些格式控制符中用以指定长度信息数字是动态而不是静态指定许多时候要到运行时才会清楚到底需要取中几个这种动态宽度/精度设置功能在sprf实现中也被考虑到了sprf采用”*”来占用个本来需要个指定宽度或精度常数数字位置同样而实际宽度或精度就可以和其它被打印变量样被提供出来于是上面例子可以变成:sprf(s,\"%.*s%.*s\",7,a1,7,a2);或者:sprf(s,\"%.*s%.*s\",(a1),a1,(a2),a2);实际上前面介绍打印、整数、浮点数等都可以动态指定那些常量值比如:sprf(s,\"%-*d\",4,’A’);//产生\"65\"sprf(s,\"%#0*X\",8,128);//产生\"0X000080\"\"#\"产生0Xsprf(s,\"%*.*f\",10,2,3.1415926);//产生\"3.14\"打印地址信息有时调试时我们可能想查看某些变量或者成员地址由于地址或者指针也不过是个32位数你完全可以使用打印无符号整数”%u”把他们打印出来:sprf(s,\"%u\",&i);不过通常人们还是喜欢使用16进制而不是10进制来显示个地址:sprf(s,\"%08X\",&i);然而这些都是间接思路方法对于地址打印sprf提供了专门”%p”:sprf(s,\"%p\",&i);我觉得它实际上就相当于:sprf(s,\"%0*x\",2*(void*),&i);利用sprf返回值较少有人注意prf/sprf返回值但有时它却是有用spritnf返回了本次最终打印到缓冲区中数目也就是说每当次sprinf结束以后你无须再次strlen便已经知道了结果串长度如:len=sprf(s,\"%d\",i); [Page]对于正整数来说len便等于整数i10进制位数下面是个完整例子产生10个[0,100)的间随机数并将他们打印到个s中以逗号分隔开###{srand(time(0));chars[64];off=0;for(i=0;i<10;i){offsprf(s+off,\"%d,\",rand%100);}s[off-1]=’\\n’;//将最后个逗号换成换行符prf(s);0;}设想当你从数据库中取出条记录然后希望把他们各个字段按照某种规则连接成个字 符串时就可以使用这种思路方法从理论上讲他应该比不断strcat效率高strcat每次都需要先找到最后那个’’位置而在上面给出例子中我们每次都利用sprf返回值把这 个位置直接记下来了使用sprf常见问题sprf是个变参使用时经常出问题而且只要出问题通常就是能导致崩溃内存访问但好在由sprf误用导致问题虽然严重却很容易找出无非就是那么几种情况通常用眼睛再把出错代码多看几眼就看出来了1缓冲区溢出第个参数长度太短了没说给个大点地方吧当然也可能是后面参数问题建议变参对应定要细心而打印串时尽量使用”%.ns”形式指定最大数2忘记了第个参数低级得不能再低级问题用prf用得太惯了//偶就常犯:(3变参对应出问题通常是忘记了提供对应某个格式符变参导致以后参数统统错位检查检查吧尤其是对应”*”那些参数都提供了吗?不要把个整数对应个”%s”编译器会觉得你欺她太甚了(编译器是obj和exe妈妈应该是个女:P)strftimesprnitf还有个不错表妹:strftime专门用于格式化时间串使用方法跟她表哥很像也是大堆格式控制符只是毕竟小姑娘家心细她还要者指定缓冲区最大长度可能是为了在出现问题时可以推卸责任吧这里举个例子:time_tt=time(0);//产生\"YYYY-MM-DDhh:mm:ss\"格式串chars[32];strftime(s,(s),\"%Y-%m-%d%H:%M:%S\",localtime(&t));sprf在MFC中也能找到他知音:CString::Formatstrftime在MFC中自然也有她同道:CTime::Format这对由于从面向对象哪里得到了赞助用以写出代码更觉优雅 2009-2-12 3:31:06 疯狂代码 /。

SPRINTFF函数

SPRINTFF函数

感觉这几个函数功能还是很强大的,有必要总结一下,主要是从网上摘抄的。

1.sprintf函数sprintf() 格式化输出函数(图形)功能:函数sprintf()用来作格式化的输出。

用法:此函数调用方式为int sprintf( char *buffer, const char *format [, argument] ... );说明:sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。

sprintf 是个变参函数,但它的的前两个参数固定,而且精华也在它的第二个参数上面,第一个参数是输入到的指定字符串。

需要注意的是如果不指定这个参数,执行过程中出现"该程序产生非法操作,即将被关闭...."的提示。

因为C 语言在进行字符串操作时不检查字符串的空间是否够大,所以可能会出现数组越界而导致程序崩溃的问题。

即使碰巧,程序没有出错,也不要这么用,因为早晚会出错。

所以一定要在调用sprintf之前分配足够大的空间给buf。

其他的一些功能:自《CSDN 社区电子杂志——C/C++杂志》(1)格式化数字字符串也就是把整数打印到字符串里去,这样用来实现整数到字符串的转换。

可以代替itoa这个函数//把整数123 打印成一个字符串保存在s 中。

sprintf(s, "%d", 123); //产生"123"可以指定宽度,不足的左边补空格:sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"注意这里123前有5个空格4567前有4个空格当然也可以左对齐:sprintf(s, "%-8d%8d", 123, 4567); //产生:"123 4567"也可以按照16 进制打印:sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐sprintf(s, "%-8X", 4568); //大写16 进制,宽度占8 个位置,左对齐(2)控制字符串打印精度浮点数的打印和格式控制是sprintf 的又一大常用功能,浮点数使用格式符‛%f‛控制,默认保留小数点后6 位数字,比如:sprintf(s, "%f", 3.1415926); //产生"3.141593"但有时我们希望自己控制打印的宽度和小数位数,这时就应该使用:‛%m.nf‛格式,其中m表示打印的宽度,n 表示小数点后的位数。

sprintf用法详解

sprintf用法详解

sprintf用法详解printf可能是许多程序员在开始学习C语言时接触到的第二个函数(我猜第一个是main),说起来,自然是老朋友了,可是,你对这个老朋友了解多吗?你对它的那个孪生兄弟sprintf了解多吗?在将各种类型的数据构造成字符串时,sprintf的强大功能很少会让你失望。

由于sprintf跟printf在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。

这也导致sprintf比printf有用得多。

所以本文着重介绍sprintf,有时也穿插着用用pritnf。

sprintf是个变参函数,定义如下:int sprintf( char *buffer, const char *format [, argument] ... );除了前两个参数类型固定外,后面可以接任意多个参数。

而它的精华,显然就在第二个参数:格式化字符串上。

printf和sprintf都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。

1.格式化数字字符串sprintf最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf在大多数场合可以替代itoa。

如://把整数123打印成一个字符串保存在s中。

sprintf(s, "%d", 123); //产生"123"可以指定宽度,不足的左边补空格:sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"当然也可以左对齐:sprintf(s, "%-8d%8d", 123, 4567); //产生:"123 4567"也可以按照16进制打印:sprintf(s, "%8x", 4567); //小写16进制,宽度占8个位置,右对齐sprintf(s, "%-8X", 4568); //大写16进制,宽度占8个位置,左对齐这样,一个整数的16进制字符串就很容易得到,但我们在打印16进制内容时,通常想要一种左边补0的等宽格式,那该怎么做呢?很简单,在表示宽度的数字前面加个0就可以了。

sprintf函数用法

sprintf函数用法

sprintf() 格式化输出函数(图形)功能:函数sprintf()用来作格式化的输出。

用法:此函数调用方式为int sprintf(char *string,char *format,arg_list);说明:函数sprintf()的用法和printf()函数一样,只是sprintf()函数给出第一个参数string(一般为字符数组),然后再调用outtextxy()函数将串里的字符显示在屏幕上。

arg_list为参数表,可有不定个数。

通常在绘图方式下输出数字时可调用sprintf()函数将所要输出的格式送到第一个参数,然后显示输出。

函数名: sprintf功能: 送格式化输出到字符串中用法: int sprintf(char *string, char *farmat [,argument,...]);程序例:#include#includeint main(void){char buffer[80];sprintf(buffer, "An approximation of Pi is %f\n", M_PI);puts(buffer);return 0;}sprintf的作用是将一个格式化的字符串输出到一个目的字符串中,而printf是将一个格式化的字符串输出到屏幕。

sprintf的第一个参数应该是目的字符串,如果不指定这个参数,执行过程中出现 "该程序产生非法操作,即将被关闭...."的提示。

因为C语言在进行字符串操作时不检查字符串的空间是否够大,所以可能会出现数组越界而导致程序崩溃的问题。

即使碰巧,程序没有出错,也不要这么用,因为早晚会出错。

所以一定要在调用sprintf之前分配足够大的空间给buf。

由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。

这也导致sprintf 比printf 有用得多。

perlsprintf()函数详解

perlsprintf()函数详解

perlsprintf()函数详解下面内容摘自:sprintf()函数返回一个格式化字串,格式化习惯是C 的库函数sprintf 的是 printf 习惯。

用法如下:1.sprintf FORMAT, LISTFORMAT 包含一个带有嵌入的域指示符的文本,LIST 里的元素就是逐一替换到这些域中去的。

sprintf 的格式:域含义%% 一个百分号%c 一个带有给定数字的字符%s 一个字串%d 一个有符号整数,十进制%u 一个无符号整数,十进制%o 一个无符号整数,八进制%x 一个无符号整数,十六进制%e 一个浮点数,科学记数法表示%f 一个浮点数,用固定的小数点表示保留两位小数 %.2f%g 一个浮点数,以 %e 或 %f 表示另外,Perl 允许下列广泛支持的转换:域含义%x 类似 %x,但使用大写字符%E 类似 %e,但使用大写的“E”%G 类似 %g,但是带一个大写的“E”(如果正确的话)%b 一个无符号整数,二进制%p 一个指针(输出十六进制的 Perl 值的地址)%n 特殊:把到目前为止输出的字符数放到参数列表中的下一个变量里最后,为了向下兼容(我们的意思就是“向下”),Perl 允许下列不必要的但广泛支持的转换:域含义%i %d 的同义词%D %ld 的同义词%U %lu 的同义词%O %lo 的同义词%F %f 的同义词Perl 允许下列众所周知的标志出现在 % 和转换字符之间:域 | 含义|space 用空格前缀正数+ 用加号前缀正数- 在域内左对齐- 用零而不是空格进行右对齐# 给非零八进制前缀“0”,给非零十六进制前缀“0x”number 最小域宽度.number “精度”:浮点数的小数点后面的位数字串最大长度。

整数最小长度l | | 把整数解释成 C 类型的 long 或者 unsigned long|h 把整数解释成 C 类型的 short 或者 unsigned short(如果没有提供标志,那么把整数解释成 C 类型 int 或者 unsigned)还有两个 Perl 相关的标志域含义V 把整数解释成 Perl 标准的整数类型v 把字串解释成一个整数向量,输出成用点分隔的数字,或者是用任意参数列表里前面带 * 的字串分隔如果你的 Perl 理解“四倍数”(64位整数),不管是该平台本机支持还是因为你指明 Perl 带着该功能编译,那么字符 d u o x X b i D U O 打印64位整数,并且它们前面可以选择前缀 ll, L,或则 q。

PHP之sprintf函数用法详解

PHP之sprintf函数用法详解

PHP之sprintf函数⽤法详解本⽂实例讲述了PHP中sprintf函数的⽤法。

分享给⼤家供⼤家参考。

具体⽤法分析如下:sprintf()函数在php官⽅是说把字符串格式化输出了,本⽂就来给各位朋友介绍⼀下在学习sprintf()函数时的⼀些经验分享,希望能给⼤家带来帮助.PHP函数 sprintf() 函数官⽅定义为:sprintf():把格式化的字符串写⼊⼀个变量中语法为:sprintf(format,arg1,arg2,arg++);参数:format:必须,转换格式arg1 :必须,规定插⼊ format 字符串中第⼀个%符号处的参数arg1 :可选,规定插⼊ format 字符串中第⼆个%符号处的参数arg1++:可选,规定插⼊ format 字符串中第三、四等%符号处的参数参数 format 的转换格式,以百分⽐符号(%)开始到转换字符结束,下⾯是有可能的format值.%% – 返回百分⽐符号%b – ⼆进制数%c – 依照 ASCII 值的字符%d – 带符号⼗进制数%e – 可续计数法(⽐如 1.5e+3)%u – ⽆符号⼗进制数%f – 浮点数(local settings aware)%F – 浮点数(not local settings aware)%o – ⼋进制数%s – 字符串%x – ⼗六进制数(⼩写字母)%X – ⼗六进制数(⼤写字母)下⾯是⼀些demo,代码如下:复制代码代码如下:// 1. %% :把 %% 替换成 %$str = '测试⼀下 %% 这个参数,会被替换成什么';echo sprintf($str);//返回结果:测试⼀下 % 这个参数,会被替换成什么(%%被替换成⼀个%)// 2. %b :该参数只能替换整型数据,如果是浮点型,只会取整数部分,会忽略⼩数点后⾯的数据。

如果是⾮整型数据。

返回 0 $str = '参数 %b 会替换成⼆进制数';$arg = '10';echo sprintf($str,$arg);//返回结果:参数 1010 会替换成⼆进制数$arg = 10.23;echo sprintf($str,$arg);//返回结果:参数 1010 会替换成⼆进制数$arg = 'abc';echo sprintf($str,$arg);//返回结果:参数 0 会替换成⼆进制数// 3. %c 返回字符编码的ASCII码$arg = 65;$str = "数字 {$arg} 对应的ASCII码为 %c ";echo sprintf($str,$arg);//返回结果:数字 65 对应的ASCII码为 A// 4. %d 将⼀段字符⾥的%d替换成int型,数据要求同 $b 相同$str = 'ID号为 %d ';$arg = -3;echo sprintf($str,$arg);//返回结果:ID号为 -3$arg = 4.5;echo sprintf($str,$arg);//返回结果:ID号为 4$arg = 'abc';echo sprintf($str,$arg);//返回结果:ID号为 0// 5. %s - 字符串$str = "这是⽤来测试的sprintf的字符串( %s )。

sprintf_s函数的用法

sprintf_s函数的用法

sprintf_s函数的用法1、该函数包含在stdio.h的头文件中。

2、sprintf和平时我们常用的printf函数的功能很相似。

sprintf函数打印到字符串中,而printf函数打印输出到屏幕上。

sprintf函数在我们完成其他数据类型转换成字符串类型的操作中应用广泛。

int sprintf( char *buffer, const char *format [, argument,...] );除了前两个参数固定外,可选参数可以是任意个。

buffer是字符数组名;format是格式化字符串(像:"%3d%6.2f%#x%o",%与#合用时,自动在十六进制数前面加上0x)。

只要在printf中可以使用的格式化字符串,在sprintf都可以使用。

其中的格式化字符串是此函数的精华。

4、char str[20];double f=14.;sprintf(str,"%6.2f",f);可以控制精度5、char str[20];int a=,b=;sprintf(str,"%3d%6d",a,b);str[]=" "可以将多个数值数据连接起来。

6、char str[20];char s1[5]={'a','b','c'};char s2[5]={'t','y','x'};sprintf(str,"%.3s%.3s",s1,s2);可以将多个字符串连接成字符串%n在字符串的输入中,m则表示宽度,字符串共占到的列数;n则表示实际的字符数。

%n在浮点数中,m也则表示宽度;n则表示小数的位数。

7、可以动态指定,需要截取的字符数char s1={'a','b','c'};char s2={'t','y','x'};sprintf(str,"%.*s%.*s",2,s1,3,s2);sprintf(s, "%*.*f", 10, 2, 3.);8、sprintf(s, "%p", &i);上面的语句相当于sprintf(s, "%0*x", 2 * sizeof(void *), &i);9、sprintf的返回值是字符数组中字符的个数,即字符串的长度,不用在调用strlen(s)求字符串的长度。

C语言的sprintf格式

C语言的sprintf格式

sprintf格式来源: 日期:2007-04-13我要评论胶粘剂结构胶硅胶密封胶中国胶粘剂网Ruby的sprintf格式与C语言的sprintf(3)基本相同。

但还是有些差别: 它没有针对C特有类型的修饰符,如short或long等; 它包含2进制数的指示符(%b); 它不支持sprintf的方言式的语法。

下面就对ruby的sprintf格式进行详细的说明。

sprintf格式的规格如下所示。

[]中的部分是可选的。

%[指定参数$][标识符][宽度][.精度]指示符若想输出`%'本身时, 请这样`%%'处理。

下面就分别介绍一下各元素的用法。

标识符标识符包括`#', `+', ` '(空格), `-'和`0'这5个。

#使用2进制、8进制、16进制的指示符(`b', `o', `x', `X')时, 会分别添加"0b", "0", "0x", "0X"前缀。

p sprintf("%#b", 10) # => "0b1010"p sprintf("%#o", 10) # => "012"p sprintf("%#x", 10) # => "0xa"p sprintf("%#X", 10) # => "0XA"对于浮点数 (`f', `e', `E', `g', `G'), 则必定在输出中添加"."。

p sprintf("%.0f", 10) # => "10"p sprintf("%#.0f", 10) # => "10."p sprintf("%.0e", 10) # => "1e+01"p sprintf("%#.0e", 10) # => "1.e+01"`g', `G'除了具有上述特性外, 还会在末尾添加多余的0。

C语言sprintf实现

C语言sprintf实现

C语⾔sprintf实现https:///a29562268/article/details/61019325我们已经知道printf()是控制台程序中最常⽤的函数,作⽤是输⼊的字符、数字等信息拼成完整的句⼦并且输出到标准输出设备(显⽰器、控制台等),sprintf()函数命名与printf()函数及其相似⼜有什么作⽤呢?···其实sprintf()作⽤也是输⼊的字符、数字等信息拼成完整的句⼦,只不过是输出在第⼀个参数中(char* 类型)。

下⾯是sprintf()定义:int sprintf(char *buf, const char *fmt, ...)sprintf()实现部分:int Test_sprintf(char *buf, const char *fmt, ...){//记录fmt对应的地址va_list args;int val;//得到⾸个%对应的字符地址Test_va_start(args, fmt);i = Test_vsprintf(buf, fmt, args);Test_va_end(args);return val;}调⽤部分实现:typedef char * va_list;#ifdef __cplusplus#define _ADDRESSOF(v) ( &reinterpret_cast<const char &>(v) )#else#define _ADDRESSOF(v) ( &(v) )#endif#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )#define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )#define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )#define _crt_va_end(ap) ( ap = (va_list)0 )#define Test_va_start _crt_va_start /* windows stdarg.h */#define Test_va_arg _crt_va_arg#define Test_va_end _crt_va_end#define ZEROPAD 1 /* pad with zero */#define SIGN 2 /* unsigned/signed long */#define PLUS 4 /* show plus */#define SPACE 8 /* space if plus */#define LEFT 16 /* left justified */#define SPECIAL 32 /* 0x */#define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */int _div(long* n,unsigned base){int __res;__res = ((unsigned long) *n) % (unsigned) base;*n = ((unsigned long) *n) / (unsigned) base;return __res;}#define do_div(n,base) _div(&n,base)/*({ \int __res; \__res = ((unsigned long) n) % (unsigned) base; \n = ((unsigned long) n) / (unsigned) base; \__res; })*/static inline int isdigit(int ch)return (ch >= '0') && (ch <= '9');}static int skip_atoi(const char **s){int i = 0;while (isdigit(**s))i = i * 10 + *((*s)++) - '0';return i;}static char *Test_number(char *str, long num, int base, int size, int precision, int type){char c, sign, tmp[66];const char *digits = "0123456789abcdefghijklmnopqrstuvwxyz";int i;if (type & LARGE)digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";if (type & LEFT)type &= ~ZEROPAD;if (base < 2 || base > 36)return 0;c = (type & ZEROPAD) ? '0' : ' ';sign = 0;if (type & SIGN) {if (num < 0) {sign = '-';num = -num;size--;} else if (type & PLUS) {sign = '+';size--;} else if (type & SPACE) {sign = ' ';size--;}}if (type & SPECIAL) {if (base == 16)size -= 2;else if (base == 8)size--;}i = 0;if (num == 0){tmp[i++] = '0';}else{while (num != 0){tmp[i++] = digits[do_div(num, base)];}}if (i > precision)precision = i;size -= precision;if (!(type & (ZEROPAD + LEFT)))while (size-- > 0)*str++ = ' ';if (sign)*str++ = sign;if (type & SPECIAL) {if (base == 8)*str++ = '0';else if (base == 16) {*str++ = '0';*str++ = digits[33];}}if (!(type & LEFT))while (size-- > 0)*str++ = c;while (i < precision--)while (i-- > 0)*str++ = tmp[i];while (size-- > 0)*str++ = ' ';return str;}int Test_vsprintf(char *buf, const char *fmt, va_list args) {int len;unsigned long num;int i, base;char *str;const char *s;int flags; /* flags to Test_number() */int field_width; /* width of output field */int precision; /* min. # of digits for integers; max Test_number of chars for from string */int qualifier; /* 'h', 'l', or 'L' for integer fields */for (str = buf; *fmt; ++fmt) {if (*fmt != '%') {*str++ = *fmt;continue;}/* process flags */flags = 0;repeat:++fmt; /* this also skips first '%' */switch (*fmt) {case '-':flags |= LEFT;goto repeat;case '+':flags |= PLUS;goto repeat;case ' ':flags |= SPACE;goto repeat;case '#':flags |= SPECIAL;goto repeat;case '0':flags |= ZEROPAD;goto repeat;}/* get field width */field_width = -1;if (isdigit(*fmt))field_width = skip_atoi(&fmt);else if (*fmt == '*') {++fmt;/* it's the next argument */field_width = Test_va_arg(args, int);if (field_width < 0) {field_width = -field_width;flags |= LEFT;}}/* get the precision */precision = -1;if (*fmt == '.') {++fmt;if (isdigit(*fmt))precision = skip_atoi(&fmt);else if (*fmt == '*') {++fmt;/* it's the next argument */precision = Test_va_arg(args, int);}if (precision < 0)precision = 0;}/* get the conversion qualifier */if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L') {qualifier = *fmt;++fmt;}/* default base */base = 10;switch (*fmt) {case 'c':if (!(flags & LEFT))while (--field_width > 0)*str++ = ' ';*str++ = (unsigned char)Test_va_arg(args, int);while (--field_width > 0)*str++ = ' ';continue;case 's':s = Test_va_arg(args, char *);len = strnlen(s, precision);if (!(flags & LEFT))while (len < field_width--)*str++ = ' ';for (i = 0; i < len; ++i)*str++ = *s++;while (len < field_width--)*str++ = ' ';continue;case 'p':if (field_width == -1) {field_width = 2 * sizeof(void *);flags |= ZEROPAD;}str = Test_number(str,(unsigned long)Test_va_arg(args, void *), 16,field_width, precision, flags);continue;case 'n':if (qualifier == 'l') {long *ip = Test_va_arg(args, long *);*ip = (str - buf);} else {int *ip = Test_va_arg(args, int *);*ip = (str - buf);}continue;case '%':*str++ = '%';continue;/* integer Test_number formats - set up the flags and "break" */ case 'o':base = 8;break;case 'X':flags |= LARGE;case 'x':base = 16;break;case 'd':case 'i':flags |= SIGN;case 'u':break;default:*str++ = '%';if (*fmt)*str++ = *fmt;else--fmt;continue;}if (qualifier == 'l')num = Test_va_arg(args, unsigned long);else if (qualifier == 'h') {if (flags & SIGN)num = (short)num;} else if (flags & SIGN)num = Test_va_arg(args, int);elsenum = Test_va_arg(args, unsigned int);str = Test_number(str, num, base, field_width, precision, flags); }*str = '\0';return str - buf;}。

sprintf的用法

sprintf的用法

sprintf的⽤法正⽂:printf 可能是许多程序员在开始学习C 语⾔时接触到的第⼆个函数(我猜第⼀个是main),说起来,⾃然是⽼朋友了,可是,你对这个⽼朋友了解多吗?你对它的那个孪⽣兄弟sprintf 了解多吗?在将各种类型的数据构造成字符串时,sprintf 的强⼤功能很少会让你失望。

由于sprintf 跟printf 在⽤法上⼏乎⼀样,只是打印的⽬的地不同⽽已,前者打印到字符串中,后者则直接在命令⾏上输出。

这也导致sprintf ⽐printf 有⽤得多。

所以本⽂着重介绍sprintf,有时也穿插着⽤⽤pritnf。

sprintf 是个变参函数,定义如下:int sprintf( char *buffer, const char *format [, argument] ... );除了前两个参数类型固定外,后⾯可以接任意多个参数。

⽽它的精华,显然就在第⼆个参数:格式化字符串上。

printf 和sprintf 都使⽤格式化字符串来指定串的格式,在格式串内部使⽤⼀些以“%”开头的格式说明符(format specifications)来占据⼀个位置,在后边的变参列表中提供相应的变量,最终函数就会⽤相应位置的变量来替代那个说明符,产⽣⼀个调⽤者想要的字符串。

格式化数字字符串sprintf 最常见的应⽤之⼀莫过于把整数打印到字符串中,所以,spritnf 在⼤多数场合可以替代itoa。

如://把整数123 打印成⼀个字符串保存在s 中。

sprintf(s, "%d", 123); //产⽣"123"可以指定宽度,不⾜的左边补空格:sprintf(s, "%8d%8d", 123, 4567); //产⽣:" 123 4567"当然也可以左对齐:sprintf(s, "%-8d%8d", 123, 4567); //产⽣:"123 4567"也可以按照16 进制打印:sprintf(s, "%8x", 4567); //⼩写16 进制,宽度占8 个位置,右对齐sprintf(s, "%-8X", 4568); //⼤写16 进制,宽度占8 个位置,左对齐这样,⼀个整数的16 进制字符串就很容易得到,但我们在打印16 进制内容时,通常想要⼀种左边补0 的等宽格式,那该怎么做呢?很简单,在表⽰宽度的数字前⾯加个0 就可以了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define PLUS 4 // Show plus
#define SPACE 8 // Space if plus
#define LEFT 16 // Left justified
#define SPECIAL 32 // 0x
return 0;
}
static void * memset(void *dst, int val, unsigned long ulcount)
{
if(!dst) return 0;
char * pchdst = (char*)dst;
while(ulcount--) *pchdst++ = (char)val;
/////////////////////////////////////////////////////////////////////////////
#define FLT_MAX_10_EXP 38
#define DBL_MAX_10_EXP 308
#define LDBL_MAX_10_EXP 308
while( ! (ret = *( unsigned char *)source - *(unsigned char *)dest) && *dest)
{
source++;
dest++;
}
if ( ret < 0 )
size--;
}
i = 0;
if (0 == num)
{
tmp[i++] = '0';
}
else
{
while (num != 0)
{
tmp[i++] = dig[((unsigned long) num) % (unsigned) base];
#endif
#ifndef va_end
#define va_end(AP) (AP = (va_list)0 )
#endif
#define ZEROPAD 1 // Pad with zero
#define SIGN 2 // Unsigned/signed long
{
char c, sign, tmp[66];
char *dig = digits;
int i;
if (type & LARGE) dig = upper_digits;
if (type & LEFT) type &= ~ZEROPAD;
if (base < 2 || base > 36) return 0;
#define LARGE 64 // Use 'ABCDEF' instead of 'abcdef'
#define abs(a) ((a) < 0 ? -(a) :(a))
#define is_digit(c) ((c) >= '0' && (c) <= '9')
c = (type & ZEROPAD) ? '0' : ' ';
sign = 0;
if (type & SIGN)
{
if (num < 0)
{
sign = '-';
num = -num;
while (--count && *first && *first == *last) first++,last++;
return ( *(unsigned char *)first - *(unsigned char *)last );
}
#endif /*NO_INCLUDE_STRING*/
while(*p++);
return (int)(p - str - 1);
}
int strcmp(const char *source,const char *dest)
{
int ret = 0;
if(!source || !dest) return -2;
char * pchsrc = (char*)src;
while(ulcount--) *pchdst++ = *pchsrc++;
return dst;
}
static int strlen(const char * str)
{
const char *p = str;
static char *digits = "0123456789abcdefghijklmnopqrstuvwxyz";
static char *upper_digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static int is_space( int ch )
static unsigned long strnlen(const char *s, int count)
{
const char *sc;
for (sc = s; *sc != '/0' && count--; ++sc);
return sc - s;
}
static char * itoa(int n, char * chBuffer)
{
sign = ' ';
size--;
}
}
if (type & SPECIAL)
{
if (16 == base)
size -= 2;
else if (8 == base)
#define va_start(AP, LASTARG) (AP = ((char *)& (LASTARG) + __va_rounded_size(LASTARG)))
#endif
#ifndef va_arg
#define va_arg(AP, TYPE) (AP += __va_rounded_size(TYPE), *((TYPE *)(AP - __va_rounded_size(TYPE))))
//#include "stdafx.h"
#define INCLUDE_STRING
#ifdef INCLUDE_STRING
#include "string.h"
#endif
#ifdef KERNEL
#define NOFLOAT
#endif
#define sprintf my_sprintf
{
int i = 1;
char * pch = chBuffer;
if(!pch) return 0;
while(n / i) i *= 10;
if(n < 0)
{
n = -n;
*pch++ = '-';
{
return (unsigned long)(ch - 9) < 5u || ' ' == ch;
}
static int atoi(char *str)
{
int sign;
int n;
char *p = str;
while (is_space(*p) ) p++;
sign = ('-' == *p) ? -1 : 1;
if ('+' == *p || '-' == *p) p++;
for (n = 0; is_digit(*p); p++)
n = 10 * n + (*p - '0');
return sign*n;
typedef char* va_list;
#ifndef __va_rounded_size
#define __va_rounded_size(TYPE) (((sizeof(TYPE)+sizeof(int)-1)/sizeof(int))*sizeof(int))
#endif
#ifndef va_start
}
#ifndef INCLUDE_STRING
#define memset my_memset
#define memcpy my_memcpy
#define strlen my_strlen
#define strcmp my_strcmp
#define strchr my_strchr
}
if (0 == n) i = 10;
while(i /= 10)
{
*pch++ = n / i + '0';
n %= i;
}
*pch = '/0';
return chBuffer;
return dst;
}
static void * memcpy(void *dst, const void *src, unsigned long ulcount)
相关文档
最新文档