Преобразование шестнадцатеричных значений в пользовательский метод hatoi int

#c

#c

Вопрос:

Здравствуйте, я пытаюсь написать свой собственный метод htoi для преобразования шестнадцатеричных значений в значения a int.

Я застрял.

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


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


     int atoi2(char s[])
     {
        int i,n;
        n=0;
        for(i=0;s[i]>='0' amp;amp; 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' amp;amp;s[i]<='9')
      {
         n=16*n (s[i]-'0');
      }
      else if(s[i]>='a'amp;amp;s[i]<='f')
      {
          n=16*n (s[i]-'a') 10;
      }
      else if(s[i]>='A'amp;amp;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, "%dn", res);
     system("pause");
     return 0;
}


 int atoi2(char s[])
 {
    int i,n;
    n=0;
    for(i=0;s[i]>='0' amp;amp; 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' amp;amp;s[i]<='9')
         {
            n=16*n (s[i]-'0');
         }
         else if(s[i]>='a'amp;amp;s[i]<='f')
         {
             n=16*n (s[i]-'a') 10;
         }
         else if(s[i]>='A'amp;amp;s[i]<='F')
         {
             n=16*n (s[i]-'A') 10;
         }
      }
      return n;      
}
 

Спасибо за помощь 🙂

Ответ №1:

Вы неправильно зацикливаетесь.

     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' amp;amp;s[i]<='9')
        {
            n=16*n (s[i]-'0');
        }
        else if(s[i]>='a'amp;amp;s[i]<='f')
        {
            n=16*n (s[i]-'a') 10;
        }
        else if(s[i]>='A'amp;amp;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 => %dn", 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. я пробовал эту итерацию раньше, и она дает мне тот же результат ошибки

2. Как это поможет? Это просто та же сумма в другом порядке.

3. @LuchianGrigore: вовсе нет, логика сдвига полностью меняется, если вы меняете порядок циклов.

4. Какой сдвиг? Я единственный, кто не видит сдвига в своем коде?

5. @harry180: для меня это работает с кодом, который вы дали, и эти две строки изменены. Убедитесь, что вы изменили len : вам нужно удалить -1 в конце того, что у вас есть (или изменить условие остановки).

Ответ №2:

 #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' amp;amp; c<='9') ? 
                       c-'0' : 
                        (c>='A' amp;amp; c <= 'F') ? 
                          10 c-'A' : 0);

}
return val;
}