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);