有人可以快速浏览一下这段 C 代码,看看为什么我会收到编译器错误吗?它是一种用于将详细信息输入日历结构的函数,并且应该创建一个节点,即日历上的一个“事件”。
struct event enter_key(void)
{
int day,month,year,starttime,endtime,length;
char* descp;
struct event* n;
printf("Enter Day:\n");
scanf("%d", &day);
printf("Enter Month:\n");
scanf("%d", &month);
printf("Enter Year: \n");
scanf("%d", &year);
printf("Enter starttime:\n"); scanf("%d", &starttime);
printf("Enter endtime:\n");
scanf("%d", &endtime);
printf("Enter Description: \n");
scanf("%s", &descp);
n=mkevent(day, month, year, starttime, endtime, &descp);
尝试编译时,我收到此消息:
newpro.c:115:警告:通过 'mkevent' 的参数 6 来自 不兼容的指针类型
谁能告诉我,我是否错误地声明了指针,或者我是否应该为“descp”指针分配空间,或者我是否尝试以错误的方式在结构中创建节点?
感谢您的阅读, C新手。
指针应指向一个足够大的缓冲区,足以容纳用户在
scanf
调用中输入的值。
%s Matches a sequence of non-white-space characters;
the next pointer must be a pointer to char, and the
array must be large enough to accept all the
sequence and the terminating NUL character. The
input string stops at white space or at the maximum
field width, whichever occurs first.
所以可能是这样的
char descp[ MAX_DESCRIPT ];
scanf("%s", descp);
尽管在实际代码中,您应该使用一种读取字符串的技术,但不能导致缓冲区溢出(以及可能的用户要求输入包含空格的描述)。
我是否尝试以错误的方式在结构中创建节点?
我不知道 mkevent 的签名,但我希望它能将指向字符串缓冲区的指针 (
const char*
) 作为描述,而不是指向字符串指针的指针(传入 descp
而不是比&descp
)。
descp 是“指向 char 的指针”(char*) 类型。 在有问题的行中,您传递的是指针本身的地址(char**)。 删除参数前面的“&”。
哦,不要在生产代码中使用 scanf(),尤其是读取字符串。 它不执行任何边界检查,可能导致缓冲区溢出。
该消息告诉您,您的
mkevent
需要一个不同类型的参数(位于 &descp 的位置)。
您应该再次检查 mkevent() 需要什么。这不是字符**。
也许你应该在 mkevent 行中将 &descp 更改为 descp - 只是猜测。
你没有显示 mkevent 的声明,但我猜你想传递
desc
,而不是它的地址。你有:
n=mkevent(day, month, year, starttime, endtime, &descp);
您可能想要:
n=mkevent(day, month, year, starttime, endtime, descp);
给我们 mkevent() 的声明会有帮助,但这很可能是因为你在应该传递 descp 时传递了 &descp。