みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

セグメンテーション違反

環境はLinux・C言語です。

#include<stdio.h>
#include<string.h>

struct book{
char author[256];
char title[256];
char publisher[256];
int year;
};

int main(void);

int main(void)
{
FILE *fp1,*fp2;
struct book data[256]={0},dummy={0};
char author[256];
char title[256];
char publisher[256];
int year;
int i=0,j=0;

fp1=fopen("biblio.txt","r");

while(fscanf(fp1,"%s,%s,%s,%d\n",&author[0],&title[0],&publisher[0],&year)!=EOF){
strcpy(&data[i].author[0],author);
strcpy(&data[i].title[0],title);
strcpy(&data[i].publisher[0],publisher);
data[i].year=year;
i++;
}
j=i;
fclose(fp1);

while(1){
for(i=0;i<256;i++){
if(data[i].year > data[i+1].year){
dummy=data[i];
data[i]=data[i+1];
data[i+1]=dummy;
break;
}
}
if(i==256) break;
}

fp2=fopen("biblio2.txt","w");

for(i=0;i<j;i++){
fwrite(&data[i],sizeof(struct book),1,fp2);
}

fclose(fp2);
return(0);
}

以上のソースで、セグメンテーションエラーが出ます。
問題は while(fscanf(fp1,"%s,%s,%s,%d\n",&author[0],&title[0],&publisher[0],&year)!=EOF){ の部分だとは思うのですが、どう改善すればいいのかわかりません。

どなたかわかる方お願い致します。

ちなみに、biblio.txtの内容は
B.W.Kernighan & D.M.Ritchie,The C Programming Language,Prentice Hall,1988
H.M.Deitel & P.J.Deitel,C How to Program,Prentice Hall,2001
J.R.Hanly & E.B.Koffman,Problem Solving and Program Design in C,Addison-Wesley,2002
D.M.Etter,Introduction to C,Prentice Hall,1999
H.H.Tan & T.B.D'Orazio,C Programming for Engineering and Computer Science,McGraw-Hill,2000
です。

投稿日時 - 2007-07-15 21:25:45

QNo.3170719

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

> while(1){
>   for(i=0;i<256;i++){
>     if(data[i].year > data[i+1].year){
>       dummy=data[i];
>       data[i]=data[i+1];
>       data[i+1]=dummy;
>       break;
>     }
>   }
>   if(i==256) break;
> }
これでは、i==255の時、存在しないdata[256]にアクセスしてしまいます。
バブルソートみたいですが、たぶん256のところは「j(読み込んだデータの数)-1」にするべきなのでは?


> ちなみに、biblio.txtの内容は
> B.W.Kernighan & D.M.Ritchie,The C Programming Language,Prentice Hall,1988
これを%sで読み込むと空白文字で途切れてしまいますが、それはかまわないのですか?

空白も読みたいなら、
 fscanf(fp1,"%[^,],%[^,],%[^,],%d\n",author,title,publisher,&year)
などとする方法があります。(他にも方法はあるでしょうけど。)
http://homepage1.nifty.com/hujitako/yapt/SmartScanf2.htm

投稿日時 - 2007-07-16 00:44:14

ANo.1

Wr5

> fp1=fopen("biblio.txt","r");

fp1がNULLになっていたりしませんか?

投稿日時 - 2007-07-15 23:36:59