在C语言中将日期格式转换为英语可读格式,例如:14/08/1994它应该打印为十八,八月九十四。如果以相同的方式写代码,我已经编写了一年中的日期和月份的代码将变得冗长
#include<stdio.h>
#include<conio.h>
int main()
{
char *str,case_ch;
int lv=0;
str=(char *)malloc(11*sizeof(char));
printf("enter the date in this format dd/mm/yyyy");
scanf("%s",str);
for(lv=0;str[lv];lv++)
{
if(str[lv]=='0')
{
switch(str[lv+1])
{
case '1':
printf("first");
break;
case '2':
printf("second ");
break;
case '3':
printf("third ");
break;
case '4':
printf("fourth ");
break;
case '5':
printf("fifth ");
break;
case '6':
printf("sixth ");
break;
case '7':
printf("seventh ");
break;
case '8':
printf("eigth ");
break;
case '9':
printf("nineth ");
break;
default:
printf("input wrong");
break;
}
break;
}
else if(str[lv]=='1')
{
switch(str[lv+1])
{
case '0':
printf("tength ");
break;
case '1':
printf("eleventh ");
break;
case '2':
printf("twelevth ");
break;
case '3':
printf("thiteenth ");
break;
case '4':
printf("fourteenth ");
break;
case '5':
printf("fifteenth ");
break;
case '6':
printf("sixteenth ");
break;
case '7':
printf("seventeenth ");
break;
case '8':
printf("eigteenth ");
break;
case '9':
printf("nineteenth ");
break;
default:
printf("input wrong");
break;
}
break;
}
else if(str[lv]=='2')
{
switch(str[lv+1])
{
case '0':
printf("twenteeth ");
break;
case '1':
printf("twenty first");
break;
case '2':
printf("twenty second ");
break;
case '3':
printf("twenty thrid ");
break;
case '4':
printf("twenty fourth ");
break;
case '5':
printf("twenty fifth ");
break;
case '6':
printf("twenty sixth ");
break;
case '7':
printf("twenty seventh ");
break;
case '8':
printf("twenty eighth");
break;
case '9':
printf("twety ningth");
break;
default:
printf("input wrong");
break;
}
break;
}
else if(str[lv]=='3')
{
switch(str[lv+1])
{
case '0':
printf("thrity ");
break;
case '1':
printf("thirty first");
break;
default:
printf("invalid input");
break;
}
break;
}
else
{
printf("invalid input");
break;
}
}
for(lv=3;str[lv];lv++)
{
if(str[lv]=='0')
{
switch(str[lv+1])
{
case '1':
printf("jan");
break;
case '2':
printf("Feb");
break;
case '3':
printf("March ");
break;
case '4':
printf("April");
break;
case '5':
printf("May ");
break;
case '6':
printf("june ");
break;
case '7':
printf("july ");
break;
case '8':
printf("august");
break;
case '9':
printf("september ");
break;
default:
printf("input wrong");
break;
}
break;
}
else if(str[lv]=='1')
{
switch(str[lv+1])
{
case '0':
printf("october");
break;
case '1':
printf("november");
break;
case '2':
printf("december");
break;
default:
printf("invalid input");
break;
}
break;
}
else
{
printf("invalid input");
break;
}
}
/*how to write code for year if i write in the above manner the code will be tooo lenghty*/
}
答案 0 :(得分:1)
我建议你的方法有两个方面的改进:
首先使用scanf
将您的输入理解为三个数字(%d
)。
边节点:处理输入字符串的方式很危险;您不仅使用malloc
而不使用free
(内存泄漏),您正在将任意大小的输入读入固定大小的缓冲区(缓冲区溢出 - >崩溃或软件中的安全漏洞)。
现在变量中有三个数字:
int day,month,year;
......这是一个更好的抽象。
接下来,花点时间考虑%
运算符。 1994 % 100
为94. 1994 / 100 % 100
为19。
记住如何用C语言定义函数。你不想重复自己。因此,如果您已经定义了一个处理序号“first”,“second”等的switch语句,那么您不需要一个处理“二十一”,“二十秒”等的单独switch语句。 11-19是英语的特例,但是21-29的工作方式与41-49相同。
所以你需要的东西是
void printOrdinalNumber(int n)
{
if(n < 20)
{
switch(n)
{
...
}
}
else
{
int tens = n / 10;
int ones = n % 10;
switch(tens)
{ ... }
if(ones >= 1)
printOrdinalNumber(ones);
}
}
您需要对基数进行相同的操作,并且您需要处理特殊情况多年。确保如果“1994”是“九十九”,“2001”并不是“二十一”。如果“1994”是“一九九四年”,“2010”仍然不是“二百一十”。