无法找出我的程序为何在c语言中崩溃 使用Windows 7 64位< /P>使用DEV C++

无法找出我的程序为何在c语言中崩溃 使用Windows 7 64位< /P>使用DEV C++,c,arrays,C,Arrays,我试图实现一个c程序,以最佳方式识别句子中出现次数最多的单词。 这就是我创造的 struct word{ char *str; int count; }; int main() { struct word words[10]={0}; int i,j,flag=0,max=0; char *maxw=NULL,*arr[] = {"how","do","you","do"}; for(i=0;arr[i];i++) {

我试图实现一个c程序,以最佳方式识别句子中出现次数最多的单词。 这就是我创造的

 struct word{
    char *str;
    int count;
    };

int main()
{
    struct word words[10]={0};
    int i,j,flag=0,max=0;
    char *maxw=NULL,*arr[] = {"how","do","you","do"};


    for(i=0;arr[i];i++)
    {
        flag =0;
        for(j=0;words[j].count!=0;j++)
            if(strcmp(words[j].str,arr[i]) == 0 )
            {
                words[j].count++;
                flag = 1;
                break;
            }

        if(flag == 0){  
        words[j].str = arr[i];
        words[j].count++;
        }

        if (max < words[j].count){
        max = words[j].count;
        maxw=words[j].str;
        }
    }
    printf("\nMost occurrences is of %s with %d count",maxw,max);

    getch();
    return 0;
}
struct-word{
char*str;
整数计数;
};
int main()
{
结构字字[10]={0};
int i,j,flag=0,max=0;
char*maxw=NULL,*arr[]={“如何”、“做”、“你”、“做”};
对于(i=0;arr[i];i++)
{
flag=0;
对于(j=0;单词[j]。计数!=0;j++)
if(strcmp(字[j].str,arr[i])==0)
{
字[j].计数++;
flag=1;
打破
}
如果(标志==0){
字[j].str=arr[i];
字[j].计数++;
}
如果(最大值<字[j].计数){
max=单词[j]。计数;
maxw=words[j].str;
}
}
printf(“\n最常出现的是%s,计数为%d”,最大值,最大值);
getch();
返回0;
}
我已经发现,只有当出现最多的单词也是句子的最后一个单词时,程序才会崩溃,这与内存中固定字符串的地址有关。但我不确定这里到底发生了什么。此外,这是一个很好的解决方案,还是存在一些更好的解决方案


另外,这不是家庭作业,我只是在练习一些编码。

您的指针数组不是以null结尾的,但在您的循环中,您正在检查null,如:

for(i=0;arr[i];i++)
因此,您应该空终止您的
arr
like

char *maxw=NULL,*arr[] = {"how","do","you","do",NULL}

`*arr[]={“如何”、“做”、“你”、“做”,NULL};顺便说一句:使用printf调试可以避免这种错误。
for(i=0;arr[i];i++)
将变得危险。它将永远不会找到任何空值来停止循环,并将访问超出绑定的内存,从而导致崩溃。@wildplasser Thanx。。我以后会用这种符号……也许它是巧合?作为循环条件,您可以为(i=0;i<4;i++{}使用treshold值:
,或者为(i=0;arr[i]!=NULL;i++}
使用sentinel值:
。在这两种情况下,您必须确保实际达到了结束条件(除非您想要无限循环)。