Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何为一个月中的几天提供后缀?_C_Date - Fatal编程技术网

C 如何为一个月中的几天提供后缀?

C 如何为一个月中的几天提供后缀?,c,date,C,Date,我需要一个函数来在显示文本时返回天数后缀,如“2008年6月5日星期三”中的“th” 它只需要对数字1到31(无需错误检查)和英语进行操作。以下函数适用于C: char *makeDaySuffix (unsigned int day) { //if ((day < 1) || (day > 31)) return ""; switch (day) { case 1: case 21: case 31: return "st"; cas

我需要一个函数来在显示文本时返回天数后缀,如“
2008年6月5日星期三”
中的“
th


它只需要对数字1到31(无需错误检查)和英语进行操作。

以下函数适用于C:

char *makeDaySuffix (unsigned int day) {
    //if ((day < 1) || (day > 31)) return "";
    switch (day) {
        case 1: case 21: case 31: return "st";
        case 2: case 22:          return "nd";
        case 3: case 23:          return "rd";
    }
    return "th";
}
char*makeDaySuffix(无符号整数天){
//如果((第1天)|(第31天)返回“”;
开关(日){
案例1:案例21:案例31:返回“st”;
案例2:案例22:返回“nd”;
案例3:案例23:返回“rd”;
}
返回“th”;
}
根据要求,它仅适用于数字1至31(含1至31)。如果您想要(可能,但不一定)原始速度,您可以尝试:

char *makeDaySuffix (unsigned int day) {
    static const char * const suffix[] = {
        "st","nd","rd","th","th","th","th","th","th","th",
        "th","th","th","th","th","th","th","th","th","th"
        "st","nd","rd","th","th","th","th","th","th","th"
        "st"
    };
    //if ((day < 1) || (day > 31)) return "";
    return suffix[day-1];
}
char*makeDaySuffix(无符号整数天){
静态常量字符*常量后缀[]={
“st”、“nd”、“rd”、“th”、“th”、“th”、“th”、“th”、“th”、“th”、“th”、“th”,
“th”、“th”、“th”、“th”、“th”、“th”、“th”、“th”、“th”、“th”、“th”、“th”、“th”
“st”、“nd”、“rd”、“th”、“th”、“th”、“th”、“th”、“th”、“th”、“th”、“th”
“圣”
};
//如果((第1天)|(第31天)返回“”;
返回后缀[第1天];
}
你会注意到,我有边界检查,虽然被注释掉了。如果有哪怕是最微小的可能会传入意外的值,您可能会希望取消对这些行的注释


请记住,在当今的编译器中,关于高级语言中什么更快的天真假设可能是不正确的:测量,不要猜测。

这里有一个替代方案,也适用于更大的数字:

static const char *daySuffixLookup[] = { "th","st","nd","rd","th",
                           "th","th","th","th","th" };

const char *daySuffix(int n)
{
    if(n % 100 >= 11 && n % 100 <= 13)
        return "th";

    return daySuffixLookup[n % 10];
}
static const char*daySuffixLookup[]={“th”、“st”、“nd”、“rd”、“th”,
“th”、“th”、“th”、“th”、“th”、“th”};
常量字符*日后缀(整数n)
{
如果(n%100>=11&&n%100
const char*getDaySuffix(int-day){
如果(第%100天>10天和第%100天<14天)
返回“th”;
开关(第%10天){
案例1:返回“st”;
案例2:返回“nd”;
案例3:返回“rd”;
默认值:返回“th”;
};
}
这一个适用于任何数字,而不仅仅是1-31。

请看我的问题:(这不是C#1)


小结:看来还没有办法,因为你的要求有限,你可以只使用一个简单的功能,就像上面贴的一样。

这是一个很好的解决方案-介意把你的手转向国际化版本吗?附言。我知道这不是原始问题的一部分,但这是一个有趣的练习。哈哈,国际化版本应该是com完全不同的是,查找表可能是实现它的最佳方式。如果((day%100)/10==1)返回“th”
,则第一个检查也可以是
const char *getDaySuffix(int day) {
    if (day%100 > 10 && day%100 < 14)
        return "th";
    switch (day%10) {
        case 1:  return "st";
        case 2:  return "nd";
        case 3:  return "rd";
        default: return "th";
    };
}