strtol()、ltoa()与sprintf()---刷题必备

1.strtol()

定义函数: long int strtol(const char *nptr, char **endptr, int base)
函数说明: strtol()会将参数nptr字符串根据参数base来转换成长整型数。参数base范围从2至36,或0。参数base代表采用的进制方式,如base值为10则采用10进制(字符串以10进制表示),若base值为16则采用16进制(字符串以16进制表示)。当base值为0时则是采用10进制做转换,但遇到如''0x''前置字符则会使用16进制做转换。一开始strtol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时(''/0'')结束转换,并将结果返回。若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回。
返回值:    返回转换后的长整型数,否则返回ERANGE并将错误代码存入errno中。
附加说明: ERANGE指定的转换字符串超出合法范围。

将字符串a, b, c 分别采用10, 2, 16进制转换成数字,用法如下:

------------------------------------------------
#include <stdlib.h>
#include <stdio.h>
main()
{
     char a[] = "100";
     char b[] = "100";
     char c[] = "ffff";
     printf("a = %d/n", strtol(a, NULL, 10)); //100
     printf("b = %d/n", strtol(b, NULL, 2));    //4
     printf("c = %d/n", strtol(c, NULL, 16)); //65535
}

又如:

signed long result;
char str[2]="123hello";
char *ptr;
result=strtol(str,&ptr,10);
//结果:result=123,*ptr="hello"

2.ltoa()

#include<stdlib.h>

定义函数: char *ltoa(long value,char *string,int radix)

函数说明:功能与Strtol()正好相反!参数3可以选择整数的进制,用法如下:

#include<iostream>
#include<stdlib.h>
using namespace std;
int main(){
    char c1[25];
    char * c2;
 cout<<"10进制 :"<<endl;
 c2=ltoa(123456,c1,10);
 cout<<"c1="<<c1<<endl;
 cout<<"c2="<<c2<<endl;
 
 cout<<"16进制 :"<<endl;
 c2=ltoa(0xef34,c1,16);
 cout<<"c1="<<c1<<endl;
 cout<<"c2="<<c2<<endl;
 
    return 0;
}

3.sprintf()

函数定义:int sprintf( char *buffer, const char *format [, argument] ... );
函数说明:sprintf 最常见的应用之一莫过于把整数打印到字符串中,所以,sprintf 在大多数场合可以替代itoa。(如linux下没有ltoa或itoa,它不是标准函数,因此不是所有编译器都支持,这种场合可以采用sprintf)

用法如下:

//把整数123 打印成一个字符串保存在s 中。
sprintf(s, "%d", 123); //产生"123"
可以指定宽度,不足的左边补空格:
sprintf(s, "%4d%4d", 123, 4567); //产生:" 1234567"
也可以按照16 进制打印:
sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐
sprintf(s, "%-8X", 4568); //大写16 进制,宽度占8 个位置,左对齐
如果使用sprintf()进行不同进制的字符串输出,可以有%x---16进制,%o---8进制,%d---10进制,但是没有二进制!只能用ltoa(),在不能使用ltoa()的情况下貌似只能自己实现了。。
char digits[]=
{
'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b',
'c', 'd', 'e', 'f', 'g', 'h',
'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z'
};

string toBinString(int i)  //功能类似于:ltoa(num,str,2);其他进制转换直接使用sprintf()
{
    char  buf[32];
    char * pBuf = buf;
    int charPos = 32;
    int radix = 1<<1;
    int mask = radix - 1;
    do
    {
        pBuf[--charPos] = digits[i&mask];
        i = i>>1;
    }while(i != 0);

    string str;
    int strLen = 32 - charPos;
    pBuf = pBuf+charPos;
    while(strLen)
    {
        str.push_back(*pBuf);
        pBuf++;
        strLen--;
    }

    return str;
}




  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ctrlturtle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值