gpt4 book ai didi

c - 如何摆脱 "Abort trap: 6"

转载 作者:太空宇宙 更新时间:2023-11-04 05:53:45 28 4
gpt4 key购买 nike

到目前为止,这是我的代码

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

int main(int argc, char **argv){
char a[15],d;
int month, day;
char *m=&a[15];
scanf("%s %s", m, &d);

if (strncmp(m,"January",7)==0) month = 1;
else if(strncmp(m,"Febuary", 7)==0) month = 2;
else if(strncmp(m,"March",5)==0) month = 3;
else if(strncmp(m,"April",5)==0) month = 4;
else if(strncmp(m,"May",3)==0) month = 5;
else if(strncmp(m,"June",4)==0) month = 6;
else if(strncmp(m,"July",4)==0) month = 7;
else if(strncmp(m,"August",6)==0) month = 8;
else if(strncmp(m,"September",9)==0) month = 9;
else if(strncmp(m,"October",7)==0) month = 10;
else if(strncmp(m,"November",8)==0) month = 11;
else if(strncmp(m,"December",8)==0) month = 12;
else {month =0; printf("invalid date");};

day = atoi(&d);

int months[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
int days = months[month-1] + day;
printf("%s %d is the %d day of the year\n",m, day, days);

return 0;
}

所有代码都正确运行,但在程序结束时它给我错误消息 Abort trap:6。我知道这与内存分配有关,但我不知 Prop 体是什么原因造成的。

编辑:旁注,对于此代码,我可以假设日期将以正确的格式键入,例如“月日”,月份始终为大写字母和实际月份等。

最佳答案

中止陷阱的发生是因为 d 是单个字符,但您试图将字符串存储到其中。 scanf 能够读取和转换数字,因此您可以删除 datoi 并仅使用 scanf 来直接读天。

我还应该指出这条线

char *m=&a[15];

m 指向数组的结尾。如果您消除 a 并将 m 声明为数组,则 m 可以用作指向数组开头的指针。

你的代码的前几行应该是这样的

int main(int argc, char **argv){
char m[16];
int month, day;
scanf("%15s%d", m, &day);

if (strcmp(m,"January")==0) month = 1;

旁注:使用 strncmp 是不必要的(因为 m 和常量字符串的格式都很好)并且容易出错(因为你可能会弄错长度)。所以应该使用 strcmp 进行比较。

正如@JonathanLeffler 在评论中指出的那样,使用 strncmp 将允许无效的月份名称通过比较。例如,

strncmp( "Maybe", "May", 3 )

将返回 0。

关于c - 如何摆脱 "Abort trap: 6",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32851417/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com