0

わかりましたので、この質問をしたかったのです:「入力の単語の長さのヒストグラムを出力するプログラムを書いてください」(Brian と dennis Ritchie による本 C プログラミングの演習 1-13)。このコードでは、さまざまな単語の長さの集計のみを出力しています (最初の試みとして)。

このプログラムは正常にコンパイルされますが、コードの実行中にこのセグメンテーション違反 (コード ダンプ) エラーが発生します。このコードの何が問題になっていますか?

#include<stdio.h>
void read(char input[]);
void draw(int i[]);
main()
{
    int i,k,l;
    int len[16];
    char input[100];
    read(input);
    i=k=l=0;
    for(l=0;l<=15;l++)
    {
        len[l]=0;
    }
    while(input[i]!='/0')
    {   
        if(input[i]!='\n'&&input[i]!='\t'&&input[i]!=' ')
        {   k++;
            i++;
        }
        else
        {   len[k]=len[k]+1;
            k=0;
            i++;    
        }
    }
    draw(len);
    return 0;
}

void read(char c[])
{
    int i=0;
    int a;
    while((a=getchar())!=EOF)
    {   c[i]=a;
        i++;
    }
    c[i]='\0';
}

void draw(int len[])
{   int i=0;
    printf("Length\tWords\n");
    for(i=1;i<=15;i++)
    printf("%6d\t%6d\n",i,len[i]);
}
4

4 に答える 4

1
for(l=0;l<=15;l++)
{
    len[l]=0;
}

配列は型でint [15]あるため、配列外の要素にアクセスしています。

drawここの関数にもまったく同じ問題があります。

for(i=1;i<=15;i++)

また:

char a;
while((a=getchar())!=EOF)

aタイプであり、 ではintありませんchar。説明については、これを参照してください。

http://c-faq.com/stdio/getcharc.html

于 2012-08-19T11:58:02.713 に答える
0

この行にはエラーが含まれています:

while(input[i]!='/0')

また、プログラムが所有していないメモリにコードがアクセスするようになります。

そのはず:

while(input[i]!='\0')

char を終了する文字列は '\0' です。

于 2012-08-19T12:40:01.313 に答える
0

私が気付くことができる1つのエラーはですfor(l=0;l<=15;l++)。である必要がありますfor(l=0;l<15;l++)

int len[15]意味は、有効なlen場所を持つサイズ15のint配列len[0], len[1], ... len[14]です。len[15]undefinedsegmentation fault

于 2012-08-19T11:59:21.817 に答える
0

関数readでは、入力の長さをチェックしないため、入力がエントリの数よりも大きい場合は、自分のものではcないメモリに書き込みます。

編集:

デバッガーにチェックインした後、エラーの理由を検索するのは簡単です。そのwhileループを見ると、非常に明確にわかります。

while(input[i]!='/0')

inputの文字を不正な文字リテラルと比較します。スラッシュを使用していますが、バックスラッシュにする必要があります: '\0'. 実際には、複数文字の文字リテラルについて警告する必要があります。

于 2012-08-19T12:09:27.480 に答える