如何 return 从 c 中的函数指针键入 char

How to return type char from function pointer in c

编写了以下代码,从结构中获取时间输入并将其全部打印到一个字符串中:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct time
{
    int hour;                                       
    int minute;                                     
    char am_pm [3];                                 
    char (*standard_time)(struct time *self);
};

char standard_time_format(struct time *self)
{
    char standard_format[8], conversion[3];
    int length;

    length = snprintf(NULL, 0, "%d", self->hour);
    snprintf(conversion, length + 1, "%d", self->hour);
    strcpy(standard_format, conversion);

    strcat(standard_format, ":");

    length = snprintf(NULL, 0, "%d", self->minute);
    snprintf(conversion, length + 1, "%d", self->minute);
    strcat(standard_format, conversion);

    strcat(standard_format, self->am_pm);

    return(standard_format);
}

int  main()
{
    struct time start;
    char standard_format[8];

    start.hour = 2;
    start.minute = 34;
    strcpy(start.am_pm, "am");
    start.standard_time = standard_time_format;

    strcpy(standard_format, start.standard_time(&start));
    printf("%s\n", standard_format);

    return 0;
}

但是,由于 return 类型似乎不兼容,因此无法打印出结果。

将类型更改为指针也没有解决问题:

在结构中:

char *(*standard_time)(struct time *self);

函数:

char *standard_time_format(struct time *self)

并在两个例程中创建一个指向 standard_format:

的指针
char *str = &standard_format;

和return函数中的指针:

return(str);

那么 return 究竟是什么类型,如何正确访问它以在 printf 命令中显示它?

编辑

按照答案中的建议,我修改了代码,将字符串作为参数传递给函数,从而解决了问题。以下是更新后的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct time
{
    int hour;
    int minute;
    char am_pm [3];
    void (*standard_time)(struct time *self, char standard_format[8]);
};

void standard_time_format(struct time *self, char standard_format[8])
{
    char conversion[3];

    snprintf(conversion, sizeof(conversion), "%d", self->hour);
    strcpy(standard_format, conversion);

    strcat(standard_format, ":");

    snprintf(conversion, sizeof(conversion), "%d", self->minute);
    strcat(standard_format, conversion);

    strcat(standard_format, self->am_pm);
}

int  main()
{
    struct time start;
    char standard_format[8];

    start.hour = 2;
    start.minute = 34;
    strcpy(start.am_pm, "am");
    start.standard_time = standard_time_format;

    start.standard_time(&start, standard_format);
    printf("%s\n", standard_format);

    return 0;
}
return(standard_format);

这里你有 returned 指向局部变量的指针,当 standard_time_format return 它的堆栈将被释放并且最终 standard_format 你 returned将失效

您应该将 char 数组传递给 standard_time_format 并在其中复制您想要 return 的字符串,而不是 return 本地变量

standard_time_format函数中做

return(standard_format);

您尝试 return 指向数组 standard_format 中第一个元素的指针(请记住,数组 衰减 指向其第一个元素的指针,即&standard_format[0])。它的类型是 char *.

但是这是非常有问题的,因为standard_format是一个局部变量在函数内部,一旦执行了 return 语句,它就会超出范围,给你留下一个 悬空指针 ,你不能取消引用(试图这样做将导致 undefined behavior).

简单而标准的解决方案是将要填充的字符串作为参数传递给函数。