运行有BUG 说明在帖子末尾
程序代码:#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 30 //30是因为可能怕数组越界
void rmb_units(int k);
void big_write_num(int l);
int main()
{
char c[N],*p;
int a,i,j,len,len_integer=0,len_decimal=0; //len_integer整数部分长度,len_decimal小数部分长度
printf("--------------------------------------------------------------------------------\n");
printf("*本程序将阿拉伯数字小写金额转换成中文大写金额!*\n");
printf("\n--------------------------------------------------------------------------------\n");
printf("please input (阿拉伯数字小写金额): ¥");
scanf("%s",c);
p=c;
len=strlen(p);
for(i=0;i<=len-1 && *(p+i)<='9' && *(p+i)>='0';i++); /*求出整数部分的长度*/
if(*(p+i)=='.' || *(p+i)=='/0') //*(p+i)=='/0'没小数点的情况
len_integer=i;
else
{
printf("\nError: 输入有错误,整数部分含有错误的字符!!!!!\n");
system("pause");
exit(EXIT_FAILURE);
}
if(len_integer>13)
{
printf("!---------------超过范围,最大万亿!整数部分最多位!程序暂停!---------------!\n");
system("pause");
printf("\n!---------程序继续执行,注意:超过万亿部分只是简单读出数字的中文大写!----------!\n");
}
printf("\n===================================转换开始!===================================\n");
printf("¥%s 的中文大写金额如下所示:\n\n人民币/RMB : ",c);
/*转换整数部分*/
for(i=0;i<len_integer;i++)
{
a=*(p+i)-'0';
if(a==0)
{
if(i==0)
{
if(*(p+1)!='.' && *(p+1)!='/0' && *(p+1)!='0')
{
printf("\n!------------输入有错误!第一位为而后整数部分有非字符,请检查!---=--------!\n");
system("pause");
printf("\n!--------------程序继续执行,注意:整数部分的剩下部分将被忽略!----------------!\n");
}
printf("零圆");
break; //若第一个是则忽略其他整数部分
}
else if(*(p+i+1)!='0' && i!=len_integer-5 && i!=len_integer-1 && i!=len_integer-9) //圆、万、亿位为时选择不加零 {
{
printf("零");
continue;
}
else if(i==len_integer-1 || i==len_integer-5 || i==len_integer-9) //圆万亿单位不能掉
{
rmb_units(len_integer+1-i);
continue;
}
else
continue;
}
big_write_num(a); //阿拉伯数字中文大写输出
rmb_units(len_integer+1-i); //人民币货币单位中文大写输出
}
/*求出小数部分的长度*/
len_decimal=len-len_integer-1;
if(len_decimal<0)
{
len_decimal=0;
printf("整"); //或正
}
if(len_decimal>2) //只取两位小数
len_decimal=2;
//printf("%d----%d-----%d/n",len,len_integer,len_decimal);
p=c;
/*转换小数部分*/
for(j=0;j<len_decimal;j++)
{
a=*(p+len_integer+1+j)-'0'; //定位到小数部分,等价于a=*(p+len-len_decimal+j)-'0';
if(a<0 || a>9)
{
printf("\n!!!!---------# Error: 输入有错误,小数部分含有错误的字符!---------!!!!\n");
system("pause");
exit(EXIT_FAILURE);
}
if(a==0)
{
if(j+1<len_decimal)
{
if(*(p+len_integer+j+2)!='0')
printf("零");
else
{
printf("整");
break;
}
}
continue;
}
big_write_num(a);
rmb_units(1-j);
}
printf("\n");
printf("\n===================================转换完成!===================================\n");
system("pause");
}
/*人民币货币单位中文大写输出*/
void rmb_units(int k)
{
//相当于const char rmb_units[]="fjysbqwsbqisbqw";
//"分角圆拾佰仟万拾佰仟亿拾佰仟万";
switch(k)
{
case 3:case 7:case 11: printf("拾");break;
case 4:case 8:case 12: printf("佰");break;
case 5:case 9:case 13: printf("仟");break;
case 6: case 14: printf("万");break;
case 10: printf("亿");break;
case 2: printf("圆");break;
case 1: printf("角");break;
case 0: printf("分");break;
default: break;
}
}
/*阿拉伯数字中文大写输出*/
void big_write_num(int l)
{
//相当于const char big_write_num[]="0123456789";
//"零壹贰叁肆伍陆柒捌玖"
switch(l)
{
case 0:printf("零");break;
case 1:printf("壹");break;
case 2:printf("贰");break;
case 3:printf("叁");break;
case 4:printf("肆");break;
case 5:printf("伍");break;
case 6:printf("陆");break;
case 7:printf("柒");break;
case 8:printf("捌");break;
case 9:printf("玖");break;
default:break;
}
}
网上找的一段 运行有BUG 如果输入100或者1000之类的数字就会出错 函数功能是将阿拉伯数字转换为大写的中文










