字符串转到整型的6种方法

5 篇文章 0 订阅

c语言中如何将16进制字符串转化成10进制整数?

#include <stdio.h>

#include <stdlib.h>

#include <string.h >

int zh(char s[])

{

    int i,m,temp=0,n;

    m=strlen(s);//十六进制是按字符串传进来的,所以要获得他的长度

    for(i=0;i<m;i++)

    {

        if(s[i]>='A'&&s[i]<='F')//十六进制还要判断他是不是在A-F或者a-f之间a=10。。

         n=s[i]-'A'+10;

        else if(s[i]>='a'&&s[i]<='f')

         n=s[i]-'a'+10;

         else n=s[i]-'0';

        temp=temp*16+n;

    }

    return temp;

}

int main()

{

    char s[10];

    gets(s);

    int n=zh(s);

    printf("%d\n",n);

    return 0;

}

第二种写法(用switch ……case语句)

#include<iostream>

#include<string>

#include<functional>

#include<cctype>

#include<vector>

#include<algorithm>

using namespace std;

string add(const string &a,const string &b); 

string multiply(const string &a,char b);    

string multi(const string &a,const string &b); 

int main(){

 string b;

 cin>>b;

 //b="12345k,mbnw{6789abxcdEf";

 b.erase(remove_if(b.begin(),b.end(),not1(ptr_fun(isxdigit))),b.end());

 cout<<b.c_str();

 //12345b6789abcdEf

 vector<string> s;

 string sum="1";

 for(int j=0;j!=b.size();++j){

  for(int i=1;i!=b.size()-j;++i)  

   sum = multi(sum,"16");

  s.push_back(sum);

  sum="1";

 }

 sum="0"; string first;

 for(int j=0;j!=b.size();++j)

 {

  switch(b[j])

  {

  case 'a':

  case 'A': 

   first="10";

   break;

  case 'b':

  case 'B': 

   first="11";

   break;

  case 'c':

  case 'C': 

   first="12";

   break;

  case 'd':

  case 'D': 

   first="13";

   break;

  case 'e':

  case 'E': 

   first="14";

   break;

  case 'f':

  case 'F': 

   first="15";

   break;

  default:

   first=string(1,b[j]);  

  }

  sum=add(sum,multi(first,s[j]));

 }

 cout<<endl;

 cout<<sum;

 system("pause");

}

string add(const string &a,const string &b)

{

 string sh,lo,r; int g=0;

 if(a.size()>b.size())

 {

  sh=string(a.size()-b.size(),'0');

  sh+=b;    lo=a;

 }

 else

 {

  sh=string(b.size()-a.size(),'0');

  sh+=a;   lo=b;

 }

 r.resize(sh.size());

 for(int i=sh.size()-1;i>=0;--i)

 {

  r[i]=sh[i]+lo[i]-48+g;

  if(r[i]>'9')

  {

   r[i]-=10;

   g=1;

  }

  else

  {

   g=0;

  }  

 }

 if(g==1)

  r="1"+r;

 return r;

}

string multiply(const string &a,char b)

{

 string r;

 r.resize(a.size()); int g=0;

 if(b=='0')

  return "0";

 if(b=='1')     //加快计算

  return a;

 for(int i=a.size()-1;i>=0;--i)

 {

  r[i]=(a[i]-48)*(b-48)%10+48+g;

  if(r[i]>'9')

  {

   r[i]-=10;

   g=((a[i]-48)*(b-48))/10+1;

   continue;

  }

  g=((a[i]-48)*(b-48))/10;   

 }

 if(g!=0)

  r.insert(0,string(1,g+48));

 return r;

}

string multi(const string &a,const string &b)

{

 string r("0"); 

 string *c=new string[b.size()];

 for(int i=0;i<b.size();++i)

 {

  c[i]=multiply(a,b[b.size()-1-i])+string(i,'0');

  r=add(r,c[i]);

 }

 delete[] c;

 return r;

}

第三种(按照十六进制转换十进制的微机原理思想)

1. 判断是为0-9或者是A-F或者a-f

2. 根据判断利用权值法转换n1*16^0+n2*16^1……

#include "stdio.h"

#include "string.h"

#define MAXLEN 80

int main(void)

{  

    char ch;

    char str[MAXLEN], num[MAXLEN];

    int i, k;

    int repeat, ri;

    long number;

    scanf("%d", &repeat);

    getchar();

    for(ri = 1; ri <= repeat; ri++)

  {i = 0;

        while((ch = getchar()) != '\n')

 {

           str[i]=ch;

            i++;

 }

        str[i] = 0;

  k=0;

  ch=i;

  for(i=0;i<ch;i++)

   {

   if((0<=str[i]<=9)&&(A<=str[i]<=F))

   {num[k]=str[i];

   k++;

   }

   }

  for(i=0;i<k;i++)

   {if(num[i]==A) str[i]=10;

   if(num[i]==B) str[i]=11;

   if(num[i]==C) str[i]=12;

   if(num[i]==D) str[i]=13;

   if(num[i]==E) str[i]=14;

   if(num[i]==F) str[i]=15;

   }

  number=0;

  for(i=0;i<k;i++)

   {ch=num[i]*16^(k-1);

   number=number+ch;

   }

       printf("Dec = %ld\n",number);

    }

}

第四种方法(16to2位运算)

//16进制的一个字符转换为十进制的数
unsigned char CConvNumsDlg::BtoH(char ch)
{
    //0-9
    if (ch >= '0' && ch <= '9') 
        return (ch - '0');         

    //9-15
    if (ch >= 'A' && ch <= 'F') 
        return (ch - 'A' + 0xA);   

    //9-15
    if (ch >= 'a' && ch <= 'f')
        return (ch - 'a' + 0xA);  
    return(255); 
}

//转换十进制数
void CConvNumsDlg::OnDecimalConv() 
{
    UpdateData(TRUE);
    //先转换为二进制
    m_strBinary = DecimalToBinary(m_strDecimal);

    //再转换为十六进制
    m_strHex = BinaryToHex(m_strBinary);
    UpdateData(FALSE);
}

//转换二进制数
void CConvNumsDlg::OnBinaryConv() 
{
    UpdateData(TRUE);
    //转换为十进制
    m_strDecimal = BinaryToDecimal(m_strBinary);

    //转换为十六进制
    m_strHex = BinaryToHex(m_strBinary);
    UpdateData(FALSE);
}

//转换十六进制数
void CConvNumsDlg::OnHexConv() 
{
    UpdateData(TRUE);
    //先转换为二进制
    m_strBinary = HexToBinary(m_strHex);

    //再转换为十进制
    m_strDecimal = BinaryToDecimal(m_strBinary);
    UpdateData(FALSE);
}

//转换十六进制为二进制
CString CConvNumsDlg::HexToBinary(CString strHex)
{
    int nLenth = strHex.GetLength();
    char* Hex = new char[nLenth];
    Hex = strHex.GetBuffer(0);
    CString strBinary = "";
    for(int i=0;i<nLenth;i++)
    {
        //转换一位十六进制数为十进制
        char h = Hex[nLenth-1-i];
        int j = BtoH(h);
        CString str;
        str.Format("%d",j);

        //转换十进制为4为二进制
        str = DecimalToBinary(str);
        strBinary += str;
    }
    return strBinary;
}

//转换二进制为十六进制
CString CConvNumsDlg::BinaryToHex(CString strBinary)
{
    int nLength = strBinary.GetLength();
    CString str = strBinary;
    //位数不是四的倍数时补齐
    switch(nLength%4)
    {
    case 0:
        break;
    case 1:
        strBinary.Format("%d%d%d%s",0,0,0,str);
        break;
    case 2:
        strBinary.Format("%d%d%s",0,0,str);
        break;
    case 3:
        strBinary.Format("%d%s",0,str);
        break;
    default:
        return "";
        break;
    }

    CString strHex,str1;
    str1 = "";
    nLength = strBinary.GetLength();
    for(int i=1;i<=(nLength/4);i++)
    {
        //每四位二进制数转换为一十六进制数
        str = strBinary.Left(4);
        CString strDecimal = BinaryToDecimal(str);
        int nDecimal = atoi(strDecimal.GetBuffer(0));
        if(nDecimal<10)
            str1.Format("%d",nDecimal);
        else
        {
            char c = 'A' + (nDecimal-10);
            str1.Format("%c",c);
        }
        strHex += str1;
        strBinary = strBinary.Right(strBinary.GetLength()-str.GetLength());
    }
    return strHex;
}

//转换十进制为二进制
CString CConvNumsDlg::DecimalToBinary(CString strDecimal)
{
    int nDecimal = atoi(strDecimal.GetBuffer(0));

    int nYushu;    //余数
    int nShang;    //
    CString strBinary = "";
    char buff[2];
    CString str = "";
    BOOL bContinue = TRUE;
    while(bContinue)
    {
        nYushu = nDecimal%2;
        nShang = nDecimal/2;
        sprintf(buff,"%d",nYushu);
        str = strBinary;
        strBinary.Format("%s%s",buff,str);
        nDecimal = nShang;
        if(nShang==0)
            bContinue = FALSE;
    }
    return strBinary;
}

//转换二进制为十进制
CString CConvNumsDlg::BinaryToDecimal(CString strBinary)
{
    int nLenth = strBinary.GetLength();
    char* Binary = new char[nLenth];
    Binary = strBinary.GetBuffer(0);
    int nDecimal = 0;
    for(int i=0;i<nLenth;i++)
    {
        char h = Binary[nLenth-1-i];
        char str[1];
        str[0] = h;
        int j = atoi(str);
        for(int k=0;k<i;k++)
        {
            j=j*2;
        }
        nDecimal += j;
    }
    CString strDecimal;

    strDecimal.Format("%d",nDecimal);
    return strDecimal;
}

第五种(调用内置函数)

主要有两个方法,其实都是对现有函数的使用:

  方法1: sscanf()

  函数名: sscanf

  功  从字符串格式化输入

  用  : int sscanf(char *string, char *format[,argument,...]);

  以上的 format 为 %x 就是将字符串格式化为 16 进制数

  例子:

  #include <stdio.h>

  void main()

  {

  char* p = "0x1a";

  int nValude = 0;

  sscanf(p, "%x", &nValude);

  printf("%d\r\n", nValude);

  }

  输出:

  26

  方法2: strtol()

  函数名: strtol

  功  将字符串转换为长整数

  用  : long strtol(char *str, char **endptr, int base);

  上面的base就是我们要转换为几进制数

  例子:

  #include <stdio.h>

  #include <stdlib.h>

  void main()

  {

  char* p = "0x1b";

  char* str;

  long i = strtol(p, &str, 16);

  printf("%d\r\n", i);

  }

  输出:

  27

  其实还有一种方法,就是用一个初始化为0~9~a~f的字符串数组,也就是一个十六进制对应表,用这个对应表即可算出一个十六进制字符串的数值,但这种发发太麻烦了,不推荐使用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值