如何摆脱 "Abort trap: 6"

How to get rid of "Abort trap: 6"

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

#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。我知道这与内存分配有关,但我不知道具体是什么原因造成的。

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

中止陷阱的发生是因为d是单个字符,但您试图将字符串存储到其中。 scanf 可以读取和转换数字,所以你可以去掉 datoi 直接用 scanf 读取日期。

我还应该指出那行

char *m=&a[15];

指向m到数组的end。如果去掉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 )

将 return 0.

首先,我在我的 Linux 框中尝试了 运行 你的代码,但没有任何问题,但是如果我为 m 输入无效日期,我会收到一个关于堆栈粉碎的错误,我认为这是什么你正在经历。 正如 Raymond 指出的那样,下面的行确实是错误的。

    char *m=&a[15];

我可能弄错了,但我相信这是说,从 a[15](无效内存)中获取值并获取该地址,然后将其存储为 m。本质上,您会在数组 a 结束后立即获得指向地址的指针。因此,当你在 m 中存储一些东西时,这不是你向 OS 请求的内存,它会导致意外行为。我建议您将该行更改为以下内容,因为它会更适合您。

char m[15];