5

我正在为我的键盘修改一些驱动程序软件,其中一部分是一个将日期输出到我的键盘屏幕的插件。目前它说的是 1 月 1 日,但我真的希望它说 1 日、2 日、3 日或 4 日或其他什么。

我一直在到处寻找某种代码,这些代码会给我一些关于如何做到这一点的想法,但我只能找到 C# 的示例,而且我正在使用 C。

编辑:

const char *ordinals[] = {"", "1st", "2nd", "3rd", "4th", "5th", "6th", "7th", "8th", "9th", "10th", "11th", "12th", "13th", "14th", "15th", "16th", "17th", "18th", "19th", "20th", "21st", "22nd", "23rd", "24th", "25th", "26th", "27th", "28th", "29th", "30th", "31st"};

sprintf(date, "%s %s", ordinals[t->tm_mday], mon);
4

4 回答 4

8

由于您只需要1通过的数字31,因此最简单的方法是定义一个序数数组,如下所示:

const char *ordinals[] = {"", "1st", "2nd", "3rd", "4th"..., "31st"};
...
printf("%s of %s", ordinals[dayNumber], monthName);

这比通过算法进行更好,因为它更具可读性,并且更容易国际化,如果您以后遇到这个问题。

于 2013-01-01T18:25:17.673 回答
6

这适用于所有非负数n

char *suffix(int n)
{
  switch (n % 100) {
    case 11: case 12: case 13: return "th";
    default: switch (n % 10) {
      case 1: return "st";
      case 2: return "nd";
      case 3: return "rd";
      default: return "th";
    }
  }
}

printf("%d%s\n", n, suffix(n));
于 2013-01-01T18:37:49.273 回答
1

你可以有条件地做到这一点。

#include <stdio.h>

const char *suff;

switch (day)
{
case 1: /* fall-through */
case 21: /* fall-through */
case 31:
  suff = "st";
  break;
case 2: /* fall-through */
case 22:
  suff = "nd";
  break;
case 3: /* fall-through */
case 23:
  suff = "rd";
  break;
default:
  suff = "th";
  break;
}

printf("%d%s\n", day, suff);
于 2013-01-01T18:24:05.973 回答
1
void day_to_string(int day, char *buffer)
{
     char *suff = "th";
     switch(day)
     {
         case 1:
         case 21:
         case 31:
           suff = "st";
           break;

         case 2:
         case 22:
           suff = "nd";
           break;

         case 3:
         case 23:
            suff = "rd";
            break;      
     }
     sprintf(buffer, "%d%s", day, suff);
 }

应该这样做。但是请注意,如果您想将您的程序翻译成另一种语言,您可能需要遵循 dasblinkenlight 的建议,因为您可能会发现某些语言的规则与英语的规则不同。

于 2013-01-01T18:36:12.233 回答