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

解決済みの質問

数字を入力して配列に格納するプログラムを書きたいです。

各行任意個の数字をスペースで区切って入力し、格納する数字は10個までとします。また、/の入力以降は数字を格納せず、プログラムを終了するようにしたいです。
PrintNumは配列に格納された数字を順番に印字する関数として、次のプログラムを書くと、数字を入力するとき、2行目を入力しようとするとエラーになってしまいます。

char line[50];
char *ptr;
int count=0;
int numbers[50];

while(*ptr!='/'){

fgets(line,50,stdin);
ptr = strtok(line," ");
if(ptr!=NULL && *ptr!='/')
numbers[count++]=atoi(ptr);
if(count>=10){
PrintNum(numbers,count);
return 0;
}
while(ptr!=NULL && *ptr!='/'){
ptr=strtok(NULL," ");
if(ptr!=NULL && *ptr!='/')
numbers[count++]=atoi(ptr);
if(count>=10){
PrintNum(numbers,count);
return 0;
}
}

}

PrintNum(numbers,count);
return 0;

最初のwhile文でたとえば while(1) とすると2行目以降も入力できることがわかったのですが、上のプログラムは何がまずいのかわかりません。教えていただけると幸いです。

投稿日時 - 2008-08-05 18:25:01

QNo.4230133

困ってます

質問者が選んだベストアンサー

以下のようなことをしたいのだと思いますが、
%test
%10 15 20[ENT]
%30 /[ENT]
10
15
20
30
%
(%はプロンプトだと思ってください)

1行目の処理を終了した後、ptrはNULLになっています。
そのため
>while(*ptr!='/'){
ここの判定でアドレス0を参照してSegment Faultになるのでしょう。

投稿日時 - 2008-08-05 19:58:44

お礼

なるほど!どこが悪かったかわかりました!!
ptrがNULLでないことを確認してから/を判定するようにすればプログラムが動きました。ありがとうございました。

投稿日時 - 2008-08-05 20:09:59

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

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

回答(4)

ANo.3

> while(*ptr!='/'){

実行開始直後は、ptrがどこを指しているかわかりません。
その状態で、先頭が'/'かどうかを判定するのはまずいです。

投稿日時 - 2008-08-05 19:17:25

補足

No.2さんへの補足の「>問題点1」のところにも書きましたが、この方法でも解決できないです。
具体的にどのようにすればよいのでしょう?
回答ありがとうございます。

投稿日時 - 2008-08-05 19:47:43

ANo.2

問題点1.
「*ptr」が領域を確保されないまま「while(*ptr!='/'){」で使用されている。
→どんな事がおこるか保障外

問題点2.
「count」がwhileループ内で初期化されていない。
→ループの二回目で「numbers[count++]」で領域破壊でおかしくなる可能性あり

問題点3.
「char line[50];」じゃ領域足りないのでは?
→「格納する数字は10個までとします。」に不足する可能性あり。

変数の初期化や使い方などいろいろと問題あり。
一度最初からフローチャートを書くなどして再設計した方がいい。

投稿日時 - 2008-08-05 19:01:23

補足

>問題点1.
無限ループにして、ptrが指す場所を指定してから
if(*ptr=='/'){
PrintNum(numbers,count);
return 0;
}
のようにループを抜け出す方法も試してみましたが、同じような結果になります。

>問題点2.
countをループ内で初期化すると、最初に格納した数字が消えてしまいそうな気がするのですが、よくわかりません。

>問題点3.
すみません、line[50]は適当です。これもいろいろ変えてみました。

ほとんど素人みたいな者なので、根本的に間違ってるのかもしれないです。最初からやり直すとしても、見通しがつかないので困っています。
回答ありがとうございました。

投稿日時 - 2008-08-05 19:29:30

ANo.1

どんなエラーが出るんでしょうか?
「ptr が NULL である」とかいうオチではないですよね?

投稿日時 - 2008-08-05 18:28:55

補足

セグメンテーション違反となるので、どこが悪いのかよくわからないのです。

投稿日時 - 2008-08-05 18:33:18

あなたにオススメの質問