C is so much better.

But what i came here to do:

I wrote this base conversion program in C. I was going to use it for encryption.... (not just base conversion, but that's a part of the algorithm). Today i tried porting it to C++. I have absolutely no clue what's wrong with it, but any help would be appreciated.

Sorry for the lack of comments, if you want an explanation about a certain part just post here and i'll explain.

Compile with 'g++ -o btob btob.cpp' (or whatever compiler you use / whatever file you choose to save it as).
It compiles fine, screws up running........ no error message. and gdb isn't helping me this time.

Code:
#include <iostream>
#include <cmath>
using namespace std;

char toch(int w) {
  if (w > 9) return (w + 55);
  else return (w + 48);
}

int toi(char w) {
  if (w > 64) return (w - 55);
  else return (w - 48);
}

string revstr(string str) {
  char tmp;
  int l = str.length(), l2 = l - 1, ong;
  for (ong = 0; ong < (l / 2); ong ++) {
    tmp = str[ong];
    str[ong] = str[l2 - ong];
    str[l2 - ong] = tmp;
  }
  return str;
}

string itob(int n, int r) {
  string blah;
  int m;
  char tmp;
  int l, l2, ong;
  for (m = 0; (n % (int)pow((float)r, (float)m)) != n; m++) {
    blah[m] = toch((n % (int)pow((float)r, (float)(m + 1))) / (int)pow((float)r, (float)m));
    n -= n % (int)pow((float)r, (float)(m + 1));
  }
  blah[m + 1] = toch((n % (int)pow((float)r, (float)(m + 1))) / (int)pow((float)r, (float)m));
  return revstr(blah);
}

int btoi(string num, int r) {
  int l = num.length(), ans = 0, ong;
  for (ong = 1; l - ong >= 0; ong++)
    ans += toi(num[l - ong]) * (int)pow((float)r, (float)(ong - 1));
  return ans;
}

int main() {
  int b1, b2;
  string num;
  cout << "FIRST BASE? ";
  cin >> b1;
  cout << "SECOND BASE? ";
  cin >> b2;
  cout << "NUMBER? ";
  cin >> num;
  cout << itob(btoi(num, b1), b2) << endl;
  return 0;
}
And here's the WORKING version in C:
(compile with 'gcc -lm -o btob btob.c'.... replace names as needed)


Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

char toch(int w);
int leng(char* str);
void revstr(char* str);
char* itob(int n, int r);
int btoi(char* num, int r);

char toch(int w) {
	if (w > 9) return (w + 55);
	else return (w + 48);
}

int toi(char w) {
	if (w > 64) return (w - 55);
	else return (w - 48);
}

int leng(char* str) {
  int x;
  for (x = 0; str[x] != 0; x++) {}
  return x;
}

void revstr(char* str) {
  char tmp;
  int l = leng(str), l2 = l - 1, ong;
  for (ong = 0; ong < (l / 2); ong++) {
    tmp = str[ong];
    str[ong] = str[l2 - ong];
    str[l2 - ong] = tmp;
  }
}

char* itob(int n, int r) {
	char* tmpstr = malloc(sizeof(char) * 1024);
	int m;
	for (m = 0; (n % (int)pow(r, m)) != n; m++) {
		tmpstr[m] = toch((n % (int)pow(r, m + 1)) / (int)pow(r, m));
		n -= n % (int)pow(r, m + 1);
	}
	tmpstr[m+1] = toch((n % (int)pow(r, m+1)) / (int)pow(r, m));
	revstr(tmpstr);
	return tmpstr;
}

int btoi(char* num, int r) {
	int l = leng(num), ans = 0, ong;
	for (ong = 1; l - ong >= 0; ong++) {
		ans += toi(num[l - ong]) * (int)pow(r, ong - 1);
	}
	return ans;
}

int main() {
  char num1[20];
  int b1, b2;
  printf("FIRST BASE? ");
  scanf("%d", &b1);
  printf("FIRST NUM? ");
  scanf("%s", num1);
  printf("SECOND BASE? ");
  scanf("%d", &b2);
  printf("%s\n", itob(btoi(num1, b1), b2));
  return 0;
}
Sorry for the incredibly long-ish post.

P.S. if you decidce you want to use my base conversion algorithm for some reason, and copy it instead of writing your own.... please give me a little credit. I know this is a pretty insignificant program but it was hard for me to write.