-1

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

我在 Codeblocks 中编写了程序,它编译并运行良好。但是 g++ 报告运行时段错误。为什么会这样?问题是 :

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

例如,考虑输入文本的以下候选: 这是用于说明此问题的示例文本。

相应的输出将显示为:

一个说明是一块问题示例文本这个到

输入格式

输入的第一行包含一个整数 N,表示输入的行数。接下来是 N 行输入文本。

输出格式

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

测试数据

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

例子

我们现在使用上面的例子来说明输入和输出格式。

样本输入

2

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

问题。

样本输出

10

一个

阐明

问题

样本

文本

这个

#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;
}
4

1 回答 1

0

每当您看到 SEGFAULT 时,下一步(除非您立即知道自己做错了什么)是启动 GDB 或其他调试器。如果您使用 GCC 并且没有使用 -ggdb 标志编译您的程序,那么现在就这样做。然后在 GDB 下启动你的程序并“运行”它。当发生段错误时,发出命令“bt”(回溯),它应该向您显示当前的调用链,这是程序段错误时您所在位置的路线图。通常这会指出你正确的问题。如果没有,至少您知道在哪里进行更多调试。

于 2012-12-18T20:12:37.530 回答