如何在C中将日期转换为可读的英文格式

时间:2014-04-11 11:06:27

标签: c

在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*/
}

1 个答案:

答案 0 :(得分:1)

我建议你的方法有两个方面的改进:

  1. 首先了解输入,然后产生输出
  2. 抽象!
  3. 首先使用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”仍然不是“二百一十”。