C++ iarcs字表运行时分段错误

C++ iarcs字表运行时分段错误,c++,runtime,segmentation-fault,C++,Runtime,Segmentation Fault,为什么下面给出IARCS报告的分段错误? 我用代码块编写了这个程序,编译和运行都很好。但是g++报告运行时seg错误。为什么会这样?问题是: 在这个问题中,输入将由多行英文文本组成,包括英文字母表中的字母、标点符号(撇号)。(句号)(逗号);(分号),:(冒号)和空白字符(空白、换行)。 您的任务是按字典顺序(即字典顺序)打印文本中的单词。每个单词在列表中应该只出现一次。您可以忽略大小写(例如,“the”和“the”将被视为同一个单词。)输出中不应有大写字母 例如,考虑下面的候选输入文本: 这是

为什么下面给出IARCS报告的分段错误?

我用代码块编写了这个程序,编译和运行都很好。但是g++报告运行时seg错误。为什么会这样?问题是:

在这个问题中,输入将由多行英文文本组成,包括英文字母表中的字母、标点符号(撇号)。(句号)(逗号);(分号),:(冒号)和空白字符(空白、换行)。 您的任务是按字典顺序(即字典顺序)打印文本中的单词。每个单词在列表中应该只出现一次。您可以忽略大小写(例如,“the”和“the”将被视为同一个单词。)输出中不应有大写字母

例如,考虑下面的候选输入文本: 这是一个示例文本来说明这一点 问题

相应的输出应为:

a 说明 是 属于 块 问题 样品 文本 这 到

输入格式

输入的第一行包含一个整数N,表示输入中的行数。然后是N行输入文本

输出格式

输出的第一行包含一个整数M,表示给定文本中不同单词的数量。接下来的M行按字典顺序列出这些单词

测试数据

你可以假设N≤ 10000,并且每行最多有80个字符。您还可以假设给定文本中最多有1000个不同的单词

范例

现在,我们使用上面的示例演示输入和输出格式

样本输入

二,

这是一个示例文本来说明这一点

问题

样本输出

十,

a

说明

一块

问题

样品

正文

这个

#包括
#包括
#包括
使用名称空间std;
int intcompare(常数void*i,常数void*j)
{
返回(strcmp(*(char**)i,*(char**)j));
}
void strToLower(字符*str)
{
int i,计数=0;
对于(i=0;*str!='\0';i++)
{
*str=(char)tolower(*str);
str++;
计数++;
}
而((计数--)!=0)str--;
}
int main()
{
int noOfLines,maxCharPerLine=80;
char-delim[]={'\'''''',','',',';',':','\n','};
字符行[maxCharPerLine+1];
cin>>努弗林;
cin.get();
字符*标记[maxCharPerLine+1];
字符*温度;
int tokcount=-1;
int标志;

对于(int i=1;i每当你看到一个SEGFAULT时,你的下一步(除非你马上知道你做错了什么)就是调出GDB或另一个调试器。如果你使用GCC并且没有用-ggdb标志编译你的程序,现在就这样做。然后在GDB下启动你的程序并“运行”它。当SEGFAULT发生时,发出命令“bt”(backtrace),它应该显示当前的调用链,这是程序发生故障时在程序中的位置的路线图。通常这会指出问题所在。如果没有,至少您知道在哪里进行更多的调试。

您认为错误在哪里?到目前为止,您试过调试程序吗?现在看起来您希望it’’it’’我会在不费劲的情况下帮你把坏掉的作业修好。
#include <iostream> 
#include <cstring> 
#include <cstdlib> 
using namespace std;

int intcompare(const void *i, const void *j)
{
    return (strcmp(*(char **)i, *(char **)j));
}

void strToLower(char *str)
{
    int i, count=0;
    for (i = 0; *str != '\0'; i++)
    {
        *str = (char)tolower(*str);
        str++;
        count++;
    }

    while((count--)!=0) str--;
}

int main()
{
    int noOfLines, maxCharPerLine=80;
    char delim[]= {'\'', '.', ',', ';', ':', '\n', ' '};
    char line[maxCharPerLine+1];

    cin>>noOfLines;
    cin.get(); 
    char *tokens[maxCharPerLine+1];
    char *temp; 
    int tokcount=-1;

    int flag;
    for(int i=1; i<=noOfLines; i++) 
    {

       cin.getline(line, maxCharPerLine+1); /
        flag=0;
        temp=strtok(line, delim);
        strToLower(temp);
        tokens[++tokcount]=(char *)malloc(maxCharPerLine+1);
        strcpy(tokens[tokcount], temp);
        while(temp!=NULL) 
        {

            strToLower(temp);
            if(flag==1)
            {
                if((char *)bsearch(&temp, tokens, tokcount+1, sizeof(tokens[0]), intcompare)==NULL) {
                    tokens[++tokcount]=(char *)malloc(maxCharPerLine+1);
                    strcpy(tokens[tokcount], temp);
                    qsort(tokens, tokcount+1, sizeof(tokens[0]), intcompare);
                }
            }
            temp= strtok(NULL, delim);
            flag=1;
        }
    }
    cout<<tokcount+1<<endl;
    for(int i=0; i<=tokcount; i++)
    {
        cout<<tokens[i]<<endl;
    }
    return 0;
}