在C++中如何编出一个函数将整型数转化为字符串形式输出?

在C++中如何编出一个函数将整型数转化为字符串形式输出?,第1张

把一个带符号的整数转换为一个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。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/12181637.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存