为什么以下给出了 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;
}