#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;
}