我对编程非常陌生并且正在尝试制定一个程序。但是,我没有得到任何有用的错误。该程序编译,但我在执行中途收到“分段错误”消息。在这个程序中,我要求输入一个月和一天,然后调用一个函数(我的计划是传递日期字符串,以及tempmonth数组的地址和tempday整数),将日期分为月份和一天,并将它们存储在地址中。然后在main中打印数据。我已经花了好几个小时来弄清楚我在指针和地址上做错了什么......但我无法理解它。这是整个代码:
#include <stdio.h>
void separate(char*,char*,int*);
int main()
{
char date[12];
printf("Enter a month and a day: ");
fgets(date,12,stdin);
char tempmonth[10];
int tempday;
separate(date,&*tempmonth,&tempday);
printf("month is %s and day is %d",tempmonth,tempday);
return 0;
}
void separate(char*date,char*tempmonth, int*tempday)
{
sscanf(date,"%s %d",*tempmonth,*tempday);
}
(由于某种原因,*不会通过char date和char tempmonth打印 - 它应该在那里。) 提前谢谢你:)
答案 0 :(得分:7)
编译器可能会向您显示如下警告:
‘%s’
期望类型‘char*’
的参数,但参数3
具有类型‘int’
‘%d’
期望类型‘int*’
的参数,但参数4
具有类型‘int’
由于sscanf
将指针作为参数传递给int
,这就是创建Segmentation fault (core dumped)
的原因。您正在访问您的计划可能无法访问的地址*tempmonth
(存储在tempmonth
中的值)。无法访问意味着该地址不属于操作系统提供给您的程序的内存,或者该进程没有访问它所需的权限。
更改行
sscanf(date,"%s %d",*tempmonth,*tempday);
到
sscanf(date,"%s %d",tempmonth,tempday);
因为tempmonth
和tempday
已经是指针。
同样在调用separate(date,&*tempmonth,&tempday);
时,&*tempmonth
与tempmonth
相同,因为您正在引用和取消引用相同的指针;两者都会取消。
答案 1 :(得分:1)
分离(日期,&安培; * tempmonth,&安培; tempday);
&*tempmonth
是tempmonth指向的对象的地址...这是tempmonth,所以&*tempmonth
- &gt; tempmonth
sscanf(日期,“%s%d”,* tempmonth,* tempday);
sscanf
需要存储数据的地址。由于tempmonth
是指向链的第一个字符的指针,*tempmonth
是您链中的第一个字符。与tempday
相同,它已经是地址,意味着*tempday
是实际值。因此,请将此行更改为:
sscanf(date,"%s %d",tempmonth, tempday);
答案 2 :(得分:0)
你应该缩小问题:导致分段错误的是什么线?
要回答这个问题,使用经验来猜测或者你可以使用像gdb这样的调试器,你可以在一行中插入一个断点,当程序运行并到达此行时,它将停止并且您将控制执行,您将能够逐步执行您的程序。
在您的示例中,尝试在函数中单独插入断点
现在您将看到当您的操作系统执行sscanf,搜索sscanf的原型,比较您传递的参数类型与sscanf所期望的内容时,会发生分段错误。您将解决问题。
`