Ok, I was bored so I decided to code it myself. It's not perfect. For instance, the last character it prints is always a space. And there might still be bugs, I haven't tested much. But at least it shows one of the better ways to do it.
Code:
#include <stdio.h>
#include <stdlib.h>
static struct {
int value;
const char *name;
} number_scales[] = {
{ 1000000, "million" },
{ 1000, "thousand" },
{ 100, "hundred" }
};
void print_number(int num)
{
unsigned int i;
if(num < 0) {
printf("minus ");
num = -num;
}
for(i = 0; i < sizeof(number_scales) / sizeof(*number_scales); i++) {
int scale_value = num / number_scales[i].value;
if(!scale_value)
continue;
print_number(scale_value);
printf("%s ", number_scales[i].name);
num %= number_scales[i].value;
if(num == 0)
return;
}
if(num >= 20) {
switch(num / 10) {
case 2: printf("twenty "); break;
case 3: printf("thirty "); break;
case 4: printf("fourty "); break;
case 5: printf("fifty "); break;
case 6: printf("sixty "); break;
case 7: printf("seventy "); break;
case 8: printf("eighty "); break;
case 9: printf("ninety "); break;
default: break;
}
num %= 10;
if(num == 0)
return;
}
switch(num) {
case 0: printf("zero "); break;
case 1: printf("one "); break;
case 2: printf("two "); break;
case 3: printf("three "); break;
case 4: printf("four "); break;
case 5: printf("five "); break;
case 6: printf("six "); break;
case 7: printf("seven "); break;
case 8: printf("eight "); break;
case 9: printf("nine "); break;
case 10: printf("ten "); break;
case 11: printf("eleven "); break;
case 12: printf("twelve "); break;
case 13: printf("thirteen "); break;
case 14: printf("fourteen "); break;
case 15: printf("fifteen "); break;
case 16: printf("sixteen "); break;
case 17: printf("seventeen "); break;
case 18: printf("eighteen "); break;
case 19: printf("nineteen "); break;
default: break;
}
}
int main(int argc, char **argv)
{
int num = argc > 1 ? atoi(argv[1]) : 0;
print_number(num);
printf("\n");
return 0;
}