把一个带符号的整数转换为一个ASCII字符串。
数字字符的ASCII值有什么特点呢?它们是颠倒顺序排列的;字符”0”的ASCII值加上1等于”1”的ASCII值,以此类推。因此,数字字符的ASCII就等于这个数字加上字符”0”的ASCII值。(注意,字符”0”的ASCII值是一个不等于零的数值,而这个数值代表着字符”0”。)也就是说,只要用数字字符的ASCII值减去字符”0”的ASCII值就能得到该数字的整数表示形式。也许我不知道字符”0”的ASCII值是多少,但是编译器知道,只要写出代码” – ‘0’ ”,编译器就会把它解释为”减去字符串’0’的ASCII值”。反过来,数字加上字符”0” 的ASCII值就应该得到与之对应的数字字符(也就是把数字转为字符)了。
#define MAX_DIGITS_INT 10 /整数位数/
void IntToStr( int num ,char str[] )
{
int i = 0, j = 0;
int isNeg = 0;
/整数位数最大为12位,包括负号/
char temp[MAX_DIGITS_INT + 2];
if( num<0 )
{
num = -1;
isNeg = 1;
}
do
{
temp[i++] = (num%10) + '0';
num/ = 10;
}while(num);
if( isNeg )
temp[i++] = '-1';
while(i>0)
str[j++] = temp[--i];
str[j] = '\0';
}
1
sprintf
是个变参函数,定义如下:
int
sprintf(
char
buffer,
const
char
format
[,
argument]
);
除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数:格式化字符串上。
2
sprintf
使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format
specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。
3
sprintf
最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf
在大多数场合可以替代itoa。
由于sprintf跟printf在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf比printf有用得多。
sprintf是个变参函数,定义如下:int sprintf( char buffer, const char format [,argument] );除了前两个参数类型固定外,后面可以接任意多个参数。而它的
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个位置,右对齐
2 控制浮点数打印格式
浮点数的打印和格式控制是sprintf的又一大常用功能,浮点数使用格式符”%f”控制,默认保留小数点后6位数字,比如:
sprintf(s,"%f", 31415926); //产生"3141593"
希望自己控制打印的宽度和小数位数,这时就应该使用:”%mnf”格式,其中m表示打印的宽度,n表示小数点后的位数。比如:
sprintf(s,"%103f",31415626); //产生:" 3142"
sprintf(s,"%-103f",31415626); //产生:"3142 "
sprintf(s,"%3f", 31415626);//不指定总宽度,产生:"3142"
3 连接字符串
sprintf的格式控制串中既然可以插入各种东西,并最终把它们“连成一串”,自然也就能够连接字符串,从而在许多场合可以替代strcat,但sprintf能够一次连接多个字符串(自然也可以同时在它们中间插入别的内容,总之非常灵活)。比如:
char who ="I";
char whom ="CSDN";
sprintf(s,"%s love %s", who, whom); //产生:"I love CSDN "
4 打印地址信息
有时调试程序时,我们可能想查看某些变量或者成员的地址,由于地址或者指针也不过是个32位的数,你完全可以使用打印无符号整数的”%u”把他们打印出来:
sprintf(s,"%u", &i);
不过通常人们还是喜欢使用16进制而不是10进制来显示一个地址:
sprintf(s,"%08X", &i);
然而,这些都是间接的方法,对于地址打印,sprintf 提供了专门的”%p”:
sprintf(s,"%p", &i);
我觉得它实际上就相当于:
sprintf(s,"%0x", 2 sizeof(void ), &i);
5 利用sprintf的返回值
较少有人注意printf/sprintf函数的返回值,但有时它却是有用的,spritnf返回了本次函数调用最终打印到字符缓冲区中的字符数目。也就是说每当一次sprinf调用结束以后,你无须再调用一次strlen便已经知道了结果字符串的长度。如:
int len =sprintf(s, "%d", i);
对于正整数来说,len便等于整数i的10进制位数。
1 保证目标缓冲区长度够用
2 格式串和后边的参数一定要对应, 个数和类型都必须相同
3 使用"%s"时更要加倍小心, 限制转换长度是个可行的方法, 如: "%100s"
4 用snprintf代替sprintf, 要安全一些
在c语言中sprintf()函数的用法如下:
1、该函数包含在stdioh的头文件中。
2、sprintf和平时我们常用的printf函数的功能很相似。sprintf函数打印到字符串中(要注意字符串的长度要足够容纳打印的内容,否则会出现内存溢出),而printf函数打印输出到屏幕上。sprintf函数在我们完成其他数据类型转换成字符串类型的 *** 作中应用广泛。
3、sprintf函数的格式:
除了前两个参数固定外,可选参数可以是任意个。buffer是字符数组名;format是格式化字符串(像:”%3d%62f%#x%o”,%与#合用时,自动在十六进制数前面加上0x)。只要在printf中可以使用的格式化字符串,在sprintf都可以使用。
使用的小技巧
sprintf的第一个参数是目的字符串,如果不指定这个参数,执行过程中出现 "该程序产生非法 *** 作,即将被关闭"的提示。
因为C语言在进行字符串 *** 作时不检查字符串的空间是否够大,所以可能会出现数组越界而导致程序崩溃的问题。
即使碰巧,程序没有出错,也不要这么用,因为早晚会出错。所以一定要在调用sprintf之前分配足够大的空间给buf。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)