return 一个结果的最佳方式

The best way to return a result

我写了下面的函数。此函数接收十六进制值的地址,例如0x4571 并从十六进制值的位位置计算日、月和年。

void fat_dir_date(char *dateAr) {   

    const unsigned int MaskDayOfMonth = 0x1F; //0000000000011111
    const unsigned int MaskMonthOfYear = 0x1E0; //0000000111100000
    const unsigned int MaskYear = 0xFE00; //1111111000000000

    unsigned int DayOfMonth = hex & MaskDayOfMonth; //AND Bit Operation

    unsigned int MonthOfYear = hex & MaskMonthOfYear; //AND Bit Operation
    MonthOfYear = MonthOfYear >> 5; //Bitshift to right position

    unsigned int Year = hex & MaskYear; //AND Bit Operation
    Year = Year >> 9; //Bitshift to right position

    printf("%d.%d.%d", DayOfMonth, MonthOfYear, 1980+Year);
}

计算正常。我在整数 DayOfMonth、MonthOfYear 和 Year 中得到了正确的数字。但是我不想用 printf 将它们打印出来,而是想 return 调用函数的值。以最好的方式连接成单个值或字符串。

用 C 语言解决这个问题的最佳方法是什么?

如果需要打印数据,不需要使用数值,我认为是这样的:

char * fat_dir_date(char *dateAr,unsigned int hex) {   

    const unsigned int MaskDayOfMonth = 0x1F; //0000000000011111
    const unsigned int MaskMonthOfYear = 0x1E0; //0000000111100000
    const unsigned int MaskYear = 0xFE00; //1111111000000000

    unsigned int DayOfMonth = hex & MaskDayOfMonth; //AND Bit Operation

    unsigned int MonthOfYear = hex & MaskMonthOfYear; //AND Bit Operation
    MonthOfYear = MonthOfYear >> 5; //Bitshift to right position

    unsigned int Year = hex & MaskYear; //AND Bit Operation
    Year = Year >> 9; //Bitshift to right position

    sprintf(dateAr,"%02u.%02u.%4u", DayOfMonth,MonthOfYear, 1980+Year);
    return dateAr;
}

int main(void)
{
    char dateAr[11];
    unsigned int hex=0x1010; //Random :)

    printf("%s\n" , fat_dir_date(dateAr,hex))

    return 0;
}

你有几个选择:

  • 创建一个具有三个字段的 struct,return 它,
  • 让来电者将您填写的struct传给您,
  • 让调用者向您传递一个字符串缓冲区,您可以使用 sprintf
  • 打印到该缓冲区
  • 动态创建一个字符串,打印到它,然后return。

第一个选项清晰易懂。它需要一些复制,但对于像您需要的小结构来说很好:

struct DateTime {
    int DayOfMonth;
    int MonthOfYear;
    int Year;
};
struct DateTime fat_dir_date(unsigned int hex) {
    struct DateTime res;
    res.DayOfMonth = ...
    res.MonthOfYear = ...
    res.Year = ...
    return res;
}