• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

перевод чисел

  • Автор темы Pront0
  • Дата начала
Статус
Закрыто для дальнейших ответов.
P

Pront0

Всем доброе время суток)
Есть задача:
На входе строка с числом в шестнадцатиричной форме. Распознать строку в переменную типа int. На выходе строки с введенным числом в двоичной, восьмиричной и десятичной форме.

Нужно решить ее на С (не плюсах).Туплю, не могу решить. На паскале делал все норм.
Но тут проблема, вобщем вот код:

[codebox]
#include <stdio.h>
#include <conio.h>

//функция для перевода интежеровского 10ого в интежеровский 2ичный
int dec_v_bin(int x) {
int k,j,y,i;
char Ch[32];

for (i=0;i<32;i++) { /* заполняем массив Ch[] */
y=x&1; //побитовое и, т.е. определяем 1 или ноль
Ch=y; //затем записываем в массив
x=x>>1; //сдвигаем
};

for(j=31;j>=0;j-=1) { /* Выводи массив Ch[] */
if(Ch[j]!=0) {
for (k=j;k>=0;k-=1) { //2 цикла которые переворачивают массив
printf("%d",Ch[k]);
};
break;
};
};
return 0;

}

//фунцкция перевода строки 16го формата в интежер 16го

int Str2Int16(char* str)
{
int i,r,n = strlen(str);
for(r=i=0;i<n;i++)
{
r*=16;
if(str>='0'&& str<='9') r+=str-'0';
if(str>='A'&& str<='F') r+=str-'A'+10;
if(str>='a'&& str<='f') r+=str-'a'+10;
}
return r;
}


int main()
{
char s[30];
int dec;
printf("Enter hex->");
scanf("%s",s); //вводим строку 16ое число
dec=Str2Int16(s); //запоминаем в dec уже интежер 16го

printf("Dec: %d\n",dec); //выводим в десятичной
printf("Oct: %o\n",dec); //восбмиричной
dec_v_bin(dec); //двоичной




getch();
return 0;
}[/codebox]


Этот код рабочий, это максимум что я смог.
А нужно чтобы строки были на выходе, т.е. можно пользоваться только %s в printf е
Т.е. последний строки должны выглядеть не так:
[codebox]printf("Dec: %d\n",dec); //выводим в десятичной
printf("Oct: %o\n",dec); //восбмиричной
dec_v_bin(dec); //двоичной[/codebox]
А:
[codebox]printf("Dec: %s\n",.....); //выводим в десятичной
printf("Oct: %s\n",...); //восбмиричной
dec_v_bin(dec); //двоичной[/codebox]
Да, и в фунцкции dec_v_bin(int x), тоже не printf("%d",Ch[k]); А printf("%s",Ch[k]);

Помогите))
 
S

Setry

вот, накатал, что-то вроде похожее и вроде работающее=)

Код:
// main.c
// На входе строка с числом в шестнадцатиричной форме. 
// Распознать строку в переменную типа int. 
// На выходе строки с введенным числом в двоичной, восьмиричной и десятичной форме.
//
#include<stdio.h>
#include<locale.h>
#include<ctype.h>
#include<stdlib.h>
#include<string.h>
#define BUF 16
#define ISGOOD(x)	(isdigit(x)||(x>='A'&&x<='F'))

char*sErrors[]={
"Не удалось получить число."	// 1
"Не хватает размера буфера, для первода числа."	// 2
};
int merrno;

int readNum(),gorner(char*,int);
void merror(char*),unGorner(int,int,char*,int);

int main()
{
int num;
char bbuf[BUF],obuf[BUF],dbuf[BUF];
setlocale(LC_ALL,"Russian");
merrno=0;
num=readNum();
if(merrno)
{
merror("readNum");
exit(merrno);
}
merrno=0;
unGorner(num,2,bbuf,BUF);
if(merrno)
{
merror("unGorner bbuf");
exit(merrno);
}
unGorner(num,8,obuf,BUF);
if(merrno)
{
merror("unGorner obuf");
exit(merrno);
}
unGorner(num,10,dbuf,BUF);
if(merrno)
{
merror("unGorner dbuf");
exit(merrno);
}
printf("\nb: %s\no: %s\nd: %s\n",bbuf,obuf,dbuf);
return 0;
}

int readNum()
{
int count,success;
char buf[BUF],*b=NULL;
for(count=0;count<3;count++)
{
printf("Введите число в шестнадцатиричной форме: ");
scanf("%s",buf);
b=buf-1;
success=1;
while(*++b)if(!ISGOOD(toupper(*b)))
{
printf("Введенно некоректное значение\n");
success=0;
break;
}
if(!success)continue;
break;
}
if(count==3)
{
merrno=1;
return -1;
}
return gorner(buf,16);
}

int gorner(char*num,int osn)
{
int n=0,t;
char*b=num-1;
while(*++b)
{
n=n*osn+(isdigit(*b)?*b-'0':*b-'A'+10);
}
return n;
}

void unGorner(int num,int osn,char*out,int l)
{
char*b=out,c;
int t,i,j;
while(num)
{
t=num%osn;
*b++=t<10?t+'0':t+'A'-10;
num/=osn;
}
*b=0;
i=0;
j=strlen(out)-1;
while(i<j)out[i++]^=out[j--]^=out[i]^=out[j];
}

void merror(char*str)
{
printf("%s: %s\n",str,sErrors[merrno-1]);
}
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!