c-分段故障(堆芯转储)错误



我正在编写一个程序,用于计算文本文件中每个单词的出现次数。我得到一个运行时错误,上面写着:分段错误(核心转储)。我知道这与试图访问尚未分配的内存有关。

此外,我收到了关于getline争论的警告,我不确定我是否正确使用了它。欢迎提出任何建议。

我的代码是:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define MAXWORDS 5000
#define MAXLINE 1000
#define MAXWORDLEN 100

int count = 0;
struct wordcount *wordPtr[MAXWORDS];
typedef struct wordcount *wordcountptr;
typedef struct wordcount {
    char word[50];
    int count;
} wordcount_t;

main()
{
    int wordfound = 0;
    int len;
    char line[MAXLINE];
    int printcount;
    while ((len = getline(line, MAXLINE, stdin))> 0)
    {
        int i = 0;
        int j = 0;
        for( ; i<len; i++)
        {
            if(line[i] != isalnum(line[i]) && line[i] != 32)
                line[i] = 32;
            else
                line[i] = tolower(line[i]);
        }
        for( ; j<len; j++)
        {
            char currentword[MAXWORDLEN];
            if(line[j] != 32)
            {
                for(i=0; line[j] != 32; i++)
                    currentword[i] = line[j];
            }
            if(line[j] == 32)
            {
                for(i=0;i<MAXWORDS; i++)
                {
                    if(strcmp(currentword, (*wordPtr[i]).word) == 0)
                    {
                        (*wordPtr[i]).count++;
                        wordfound = 1;
                    }
                }
                if(wordfound == 0)
                {
                    wordPtr[i] = (wordcount_t*)malloc(sizeof(wordcount_t));
                    strcpy((*wordPtr[i]).word, currentword);
                    (*wordPtr[i]).count = 1;
                    count++;
                }
            }
            wordfound = 0;
        }
    }
    for(printcount = 0; printcount < count; printcount++)
        printf("There are %d occurances of the word %sn", (*wordPtr[printcount]).count, (*wordPtr[printcount]).word);
    for(printcount = 0; printcount < MAXWORDS; printcount++)
    {
        free((void*)wordPtr[printcount]);
        wordPtr[printcount]= NULL;
    }
}

getline()期望第一个agrument的类型为char **,因此您应该这样称呼它:

getline(&line, MAXLINE, stdin)

因为line是一个char数组,所以它等效于char *而不是所需的char **

引用这个SO答案,使用char **而不是char *的原因是:

您需要传入一个char**(即指向一个char*的指针),以便函数能够更新它所指向的char*的值。

ssize_t getline(char **lineptr, size_t *n, FILE *stream);这是getline原型,第一个参数是char **,而不是char *,您可以这样使用:getline(&line, MAXLINE, stdin)

相关内容

  • 没有找到相关文章

最新更新