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
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 に答える
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 に答える