如何 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).
简单而标准的解决方案是将要填充的字符串作为参数传递给函数。
编写了以下代码,从结构中获取时间输入并将其全部打印到一个字符串中:
#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).
简单而标准的解决方案是将要填充的字符串作为参数传递给函数。