将十六进制值转换为int custom atoi方法

时间:2011-10-23 10:04:31

标签: c

您好我尝试编写自己的htoi方法,将十六进制值转换为int值。

我陷入了困境。

    #include <stdio.h>
    #include <string.h>


    int main(int argc, char **argv)
    {
       int res = htoi2(argv[1]);
       fprintf(stdout, "%s => %d\n", argv[1], res);
       return 0;
     }


     int atoi2(char s[])
     {
        int i,n;
        n=0;
        for(i=0;s[i]>='0' && s[i]<='9';++i)
        {
           n=10*i+(s[i]-'0');                 
        }  
        return n; 

     }


  /*htoi(s)*/

   int htoi2(char s[])
   {       
   int i,n,len;
   n=0;
   len = strlen(s);
   for(i=0; i<len; i++)
   {
      if(s[i]>='0' &&s[i]<='9')
      {
         n=16*n+(s[i]-'0');
      }
      else if(s[i]>='a'&&s[i]<='f')
      {
          n=16*n+(s[i]-'a')+10;
      }
      else if(s[i]>='A'&&s[i]<='F')
      {
          n=16*n+(s[i]-'A')+10;
      }
  }
  return n;      
}

它似乎应该有效,但它没有:(

有人在我写的代码中看到一些错误吗?

感谢您提前:)

问题已解决

/*working code*/
int main(int argc, char **argv)
{
     char c[2];
     c[0]='F';
     c[1]='F';
     int res = htoi2(c);
     fprintf(stdout, "%d\n", res);
     system("pause");
     return 0;
}


 int atoi2(char s[])
 {
    int i,n;
    n=0;
    for(i=0;s[i]>='0' && s[i]<='9';++i)
    {
        n=10*i+(s[i]-'0');                 
    }  
    return n; 

 }


 /*htoi(s)*/

 int htoi2(char s[])
 {       
      int i,n,len;
      n=0;
      len = strlen(s);
      for(i=0; i<len; i++)
      {
         if(s[i]>='0' &&s[i]<='9')
         {
            n=16*n+(s[i]-'0');
         }
         else if(s[i]>='a'&&s[i]<='f')
         {
             n=16*n+(s[i]-'a')+10;
         }
         else if(s[i]>='A'&&s[i]<='F')
         {
             n=16*n+(s[i]-'A')+10;
         }
      }
      return n;      
}

感谢您的帮助:)

2 个答案:

答案 0 :(得分:3)

你绕错了路。

    len = strlen(s);
    for(i=0; i<len; i++)
    {
       ...

你的main错了。 C - 字符串需要以0结尾。如果你想“手动”初始化它,你可以这样做:

    char c[3];
    c[0]='1';
    c[1]='1';
    c[2]=0;    // note: a real 0, not '0'

演示:

#include <stdio.h>
#include <string.h>

int htoi(char s[])
{
    int i,n,len;
    n=0;
    len = strlen(s);
    for(i=0; i<len; i++)
    {
        if(s[i]>='0' &&s[i]<='9')
        {
            n=16*n+(s[i]-'0');
        }
        else if(s[i]>='a'&&s[i]<='f')
        {
            n=16*n+(s[i]-'a')+10;
        }
        else if(s[i]>='A'&&s[i]<='F')
        {
            n=16*n+(s[i]-'A')+10;
        }
    }
    return n;
}

int main(int argc, char **argv)
{
    int res = htoi(argv[1]);
    fprintf(stdout, "%s => %d\n", argv[1], res);
    return 0;
}

的作用:

$ gcc -Wall -m64 -o t t.c
$ ./t 0
0 => 0
$ ./t 1
1 => 1
$ ./t a
a => 10
$ ./t f
f => 15
$ ./t 10
10 => 16
$ ./t 11
11 => 17
$ ./t 1a
1a => 26
$ ./t ff
ff => 255

答案 1 :(得分:0)

#include <stdio.h>
#include <string.h>

int htoi(char s[])
{
char *p = s;
char c;
int   val =0;

while((c = *p++)) {
  c = toupper(c);
  val = (val << 4) | ((c>='0' && c<='9') ? 
                       c-'0' : 
                        (c>='A' && c <= 'F') ? 
                          10+c-'A' : 0);

}
return val;
}