-1

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

1 に答える 1

0

SEGFAULT が表示されたら、次のステップは (何が間違っていたのかすぐに分からない限り)、GDB または別のデバッガーを起動することです。GCC を使用していて、プログラムを -ggdb フラグでコンパイルしなかった場合は、ここでコンパイルしてください。次に、GDB でプログラムを起動して「実行」します。segfault が発生したら、コマンド 'bt' (backtrace) を発行すると、現在のコール チェーンが表示されます。これは、segfault が発生したときにプログラム内のどこにいたかを示すロードマップです。通常、それは問題を正しく示しています。そうでない場合は、少なくとも、さらにデバッグを行う場所を知っています。

于 2012-12-18T20:12:37.530 に答える