2

私はこの機能を使用しています:

int times_on_table(char *search,struct table index[],int wct){
 int ct=0,num=0;
 while(ct<wct){
     if(strcmp(search,(index[ct].label))==0) {
         num++;
     }
     ct++;
 }
 return num;
}

構造体の配列を検索し、特定の文字列が配列に格納されているすべての時間を見つけ、文字列が出現する回数を返します。メイン内でこの関数を使用するときはいつでも:

/*EDIT: i had a main from the wrong program my apologies*/

int main(int argc, char **argv){
    int numwds=get_num_words(argv[1]);
    struct table index[numwds];

    int a;
    struct cmd_ops symbol[22];
    store(argv[1],index,numwds);
    ops_gen(symbol);
    int b=times_on_table("in",index,numwds);
    printf("%d",b);
}

コードは正常に動作します。ただし、このような特定の関数内で使用しようとすると

struct table* store(char *filename,struct table index[]) {
    FILE *fp;
    fp=fopen(filename,"r");
    char *a;int d=0,e=0,t=0;
    a=malloc(60);
    int wordcount=get_num_words(filename);
    while(d<wordcount){
        fscanf(fp,"%s",a);
        if ((index[d].label=strdup(a))==NULL)
            break;
        index[d].word_num=d;

        times_on_table("this",index,wordcount);/*when i comment this out
                                                 of my code it runs fine*/

        index[d].address=findline(filename,index[d].label,wordcount,index,t);
        d++;
    }
    free(a);
}

コードが実行されず、セグメンテーション違反が発生します。何かご意見は?

編集:これが役立つかどうかはわかりませんが、セグメンテーション違反が発生すると、メインのコードの最初の行が実行される前に発生します。

編集: times_on_table() が呼び出されたときにセグメンテーション違反を引き起こす他の関数は次のとおりです。

int findline(char *filename,char *check,int wordcount,struct table index[],int t){
char *a;
a=malloc(60);
int b=line_count(filename);
int ch;
fpos_t pos;

int line=0,wd=0,loc,s=0,c=1,times;

times=times_on_table(check,index,wordcount);

FILE *fp;
fp=fopen(filename,"r");

int list[wordcount];

while(c<=b){
    fscanf(fp,"%s",a);
    fgetpos(fp,&pos);

    ch=fgetc(fp);ch=fgetc(fp);

    if(strcmp(a,check)==0){
       if(times==0)
            return line;
       else
            times--;
    }

    if(ch==10){
        line++;c++;
    }
    else
        fsetpos(fp,&pos);
    }
    return line;
 }

最初に times_on_table() を追加したのはこの関数で、セグメンテーション違反によりプログラムが実行されなくなりました。

4

3 に答える 3

0

ここ

while(d<wordcount){
    fscanf(fp,"%s",a);
    if ((index[d].label=strdup(a))==NULL)
        break;
    index[d].word_num=d;

    times_on_table("this",index,wordcount);

"this"長い配列での発生をカウントしようとしましたが、配列のスロットをwordcount埋めただけです。d+1他のスロットにはガベージが含まれてindex[ct].labelいる可能性があり、アクセスするとセグメンテーション違反が発生する可能性がありct > dます。

于 2012-04-24T19:19:13.710 に答える
0

配列インデックスを超えている可能性が非常に高いです。これらの 2 つの行は実際には一致しません (あなたが私たちと共有したコードから:

int wordcount=get_num_words(filename);
times_on_table("this",index,wordcount);

( wordcount はfilename、最初のパラメーターとして渡されるものをカウントすると思いますが、あなたとは無関係のようですstruct table index[])

したがって、 に渡されるパラメータはstruct table index[]、おそらく に格納する値とは異なるサイズですwordcount。配列サイズをパラメーターとして関数に渡し、実際の例storeと同じように使用することをお勧めしますmain。例

struct table* store(char *filename,struct table index[], int structSize){
....
times_on_table("this",index,structSize); //replace b from the call in main
}
于 2012-04-24T18:54:06.203 に答える
0

「index[d].label」を適切に設定することに関連している可能性があります。times_on_table() 関数の外側にあるすべてのラベルを、何も比較せずに出力してみてください。

于 2012-04-24T19:10:17.647 に答える