Prova con queste funzioni (non assicuro che siano corrette e, soprattutto, non funzionano con numeri negativi!):
codice:
inline int intpow(int val, int p) { return (p ? val * intpow(val, p-1) : 1); }

int valore(char c) {
   int ret = 0;
   if ((c >= '0') && (c <= '9')) {
      ret = c - '0';
   } else {
      switch( (char) (c & 223) ) {
         case 'A': ret = 10; break;
         case 'B': ret = 11; break;
         case 'C': ret = 12; break;
         case 'D': ret = 13; break;
         case 'E': ret = 14; break;
         case 'F': ret = 15; break;
      }
   }
   return ret;
}

int conv(char *str, int radix) {
   int ret = 0;
   int i = 0;
   switch( radix ) {
      case 10:
         for(i = strlen(str); i; i--) {
            ret += (str[i-1] - '0') * intpow(radix, strlen(str)-i);
         }
         break;
      
      case 16:
         for(i = strlen(str); i; i--) {
            ret += valore(str[i-1]) * intpow(radix, strlen(str)-i);
         }
   }
   
   return ret;
}
Un esempio di utilizzo:
codice:
int main(int argc, char **argv) {
   printf("Conversione 0xAF: %d\n", conv("af", 16));
   return 0;
}
Ciao.