Как найти в строке шестнадцатеричное число? - C (СИ)
Формулировка задачи:
Упакованная строка, содержащая символьное представление шестнадцатеричных чисел.
//Все символы строки, кроме цифр, помещаются в последовательность в исходном виде.
//Последовательность цифр преобразуется в целую переменную, которая записывается в упакованную строку,
//предваренная символом \0.
//Конец строки - два подряд идущих символа \0. Пример:для шестнадцатеричных чисел.
//- исходная строка : "aa0x24FFbbb0xAA65"
//- упакованная строка : 'a' 'a''\0' 0x24FF 'b' 'b' 'b' '\0' 0xAA65 '\0' '\0'
#define LEN 11
void getData(char * str)
{
printf("Введите последовательность(не более %d) буквенно-числовых символов:\n", LEN - 1);
fgets(str, LEN, stdin);
}
void strPack(char * str)
{
char packstr[256] = "";//строка для упаковки
int num = 0;
while (1)
{
if (isalpha(*str))
{
num = 0;
sprintf(packstr + strlen(packstr), "'%c'", *str);
}
else if //как сказать что следующие значения-шестнадцатеричное число и вывести его?
}
if (!*str++)
{
sprintf(packstr + strlen(packstr), "'\\0''\\0'");
break;
}
}
puts(packstr);
}
void main()
{
setlocale(0, "RUS");
char str[LEN];
getData(str);
strPack(str);
system("Pause");
}Решение задачи: «Как найти в строке шестнадцатеричное число?»
textual
Листинг программы
#include <stdio.h>
int parse_hex(const char* s, unsigned int* h){
const char* p;
unsigned int n;
if((*s != '0') || ((*(s + 1) & 0xDF) != 'X'))
return 0;
for(n = 0, p = s + 2; *p; ++p){
if(*p >= '0' && *p <= '9')
n = (n << 4) | (unsigned int)(*p - '0');
else if(*p >= 'A' && *p <= 'F')
n = (n << 4) | (unsigned int)(*p - 'A' + 10);
else
break;
}
//проверка на переполнение
if(((int)(p - s) - 2) > (int)(sizeof(n) << 1))
return 0;
*h = n;
return (p != s + 2) ? (int)(p - s) : 0;
}
int main(void){
int i;
unsigned int n;
const char* p;
char s[] = "0xDF, 0xABCDEF (0x12345678) 0x70D01-0xDDE. s0x24FFax i0xE";
for(p = s; *p; ){
i = parse_hex(p, &n);
if(i > 0){
printf("0x%X\n", n);
p += i;
} else
++p;
}
return 0;
}