varredura de uma string para matriz de caracteres hexadecimais

Aqui está o meu código de exemplo:

char a;
char str [20];
unsigned char b[8] ;
unsigned char c[8];

int argsread;
int i;

init_8051();

while(1)
{
    printf("\n enter a 64 bit operation \n");

    argsread = scanf("%s", str);

    sscanf(str, "0x%x%c0x%x", b, &a, c);

    printf("\n %d arguments read \n",argsread);

        for(i=0;i<8;i++)
{
             printf("\n %#x %c %#x\n",b[i],a,c[i]);
}
        }

}

O problema aqui é que, quando entro, por exemplo, no terminal, a seguinte entrada: 0x1234567890abcdef + 0x1234567890abcdef

isso leva a um erro em que a saída do array de caracteres está totalmente errada e a maioria dos números é atribuída a um, que deveria ter sido o sinal de mais, estou fazendo algo fundamentalmente errado?

Atualizar: Mudei meu código para o seguinte:

while(1)
{
printf("\n enter a 64 bit operation \n");
argsread = scanf("%s", str);
sscanf(str, "0x%s%c0x%s", b, &a, c);
printf("\n %d arguments read \n",argsread);

printf("\n %s \n",b);
}

e eu aumentou o tamanho de str para 30 o problema é que a saída do programa é:

 1 arguments read 

 abcdef+0xabcdef 

então o valor de b em vez de apenas abcdef é a string toda !!

Update2: Encontrei este código que funciona perfeitamente, mas eu queria usar scanf em vez de cin, aqui está o código

:`#include <iostream> 

using namespace std;

int main()
{

  float a, b, result;
    char oper, clear;
    cout << "Please enter an equation: i.e 5+5 " << endl;
    for (;;) {
          cin >> a;
          cin >> oper;
          cin >> b;
         if (oper == '+')
        result = a + b;
         else if (oper == '-')
            result = a - b;
       else if (oper == '*')
              result = a * b;
     else if (oper == '/')
              result = a / b;   
    cout << "= " << result << endl << endl;
    cin.clear();
    cin.ignore();
   } 
} `

questionAnswers(3)

yourAnswerToTheQuestion