switch (*format != ' \0 ' ? *format++ : ' \0 ' ) case ' d ' : printf_integer( va_arg(var_arg, int ) ); break ; case ' f ' : printf_float( va_arg(var_arg, double ) ); break ; case ' c ' : putchar( va_arg(var_arg, int ) ); break ; case ' s ' : str = va_arg(var_arg, char * ); while (*str++ != ' \0 ' ) putchar( * str); break ; static char *digits[] = { "" , " ONE " , " TWO " , " THREE " , " FOUR " , " FIVE " , " SIX " , " SEVEN " , " EIGHT " , " NINE " , " TEN " , " ELEVEN " , " TWLEVE " , " THIRTEEN " , " FOURTEEN " , " FIFTEEN " , " SIXTEEN " , " SEVENTEEN " , " EIGHTEEN " , " NINETEEN " }; static char *tens[] = { "" , "" , " TWENTY " , " THIRTY " , " FORTY " , " FIFTY " , " SIXTY " , " SEVENTY " , " EIGHTY " , " NINETY " }; static char *magnitudes[] = { "" , " THOUSAND " , " MILLION " , " BILLION " }; static void do_one_group(unsigned int amount, char *buffer, char ** magnitude) int value = amount / 1000 ; // 不断取商得到高三位 if (value > 0 ) do_one_group(value, buffer, magnitude + 1 ); amount %= 1000 ; // 取余数则是得到低三位 value = amount / 100 ; if (value > 0 ) strcat(buffer, digits[value]); strcat(buffer, " HUNDRED " ); value = amount % 100 ; if (value >= 20 ) strcat(buffer, tens[value / 10 ]); value %= 10 ; if (value > 0 ) strcat(buffer, digits[value]); if (amount > 0 ) strcat(buffer, *magnitude); // 此处最易错。 void written_amount(unsigned int amount, char * buffer) if (amount == 0 ) strcpy(buffer, " ZERO " ); buffer = ' \0 ' ; do_one_group(amount, buffer, magnitudes);