IARCS によって報告されたように、次の場合にセグメンテーション エラーが発生するのはなぜですか?
Codeblocks でプログラムを書きましたが、コンパイルして正常に実行されます。しかし、g++ はランタイム セグメント エラーを報告します。これはなぜですか?質問は :
この質問では、入力は、英語のアルファベットの文字、句読点 ' (アポストロフィ)、. (ピリオド), , (コンマ), ; (セミコロン)、:(コロン)、および空白文字 (空白、改行)。ここでのタスクは、テキスト内の単語を辞書順 (つまり、辞書順) に出力することです。各単語は、リストに 1 回だけ表示される必要があります。大文字と小文字は無視できます (たとえば、"The" と "the" は同じ単語として扱われます)。出力に大文字は含まれません。
たとえば、次の入力テキストの候補を考えてみましょう。これは、この質問を説明するためのサンプル テキストです。
対応する出力は次のようになります。
イラストはピース問題のサンプルテキストです
入力形式
入力の最初の行には、入力の行数を示す単一の整数 N が含まれます。これに N 行の入力テキストが続きます。
出力フォーマット
出力の最初の行には、指定されたテキスト内の個別の単語の数を示す単一の整数 M が含まれています。次の M 行は、これらの単語を辞書順に並べたものです。
テストデータ
N ≤ 10000 で、各行に最大 80 文字あると仮定できます。また、指定されたテキストには最大で 1000 個の異なる単語があると想定することもできます。
例
上記の例を使用して、入力と出力の形式を説明します。
サンプル入力
2
これは、これを説明するためのサンプル テキストです。
問題。
サンプル出力
10
a
例証する
は
の
ピース
問題
サンプル
文章
これ
に
#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;
}