• ベストアンサー

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

各行任意個の数字をスペースで区切って入力し、格納する数字は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行目以降も入力できることがわかったのですが、上のプログラムは何がまずいのかわかりません。教えていただけると幸いです。

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

  • ベストアンサー
  • andy_kun
  • ベストアンサー率23% (64/274)
回答No.4

以下のようなことをしたいのだと思いますが、 %test %10 15 20[ENT] %30 /[ENT] 10 15 20 30 % (%はプロンプトだと思ってください) 1行目の処理を終了した後、ptrはNULLになっています。 そのため >while(*ptr!='/'){ ここの判定でアドレス0を参照してSegment Faultになるのでしょう。

Franz3
質問者

お礼

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

その他の回答 (3)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

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

Franz3
質問者

補足

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

  • arain
  • ベストアンサー率27% (292/1049)
回答No.2

問題点1. 「*ptr」が領域を確保されないまま「while(*ptr!='/'){」で使用されている。 →どんな事がおこるか保障外 問題点2. 「count」がwhileループ内で初期化されていない。 →ループの二回目で「numbers[count++]」で領域破壊でおかしくなる可能性あり 問題点3. 「char line[50];」じゃ領域足りないのでは? →「格納する数字は10個までとします。」に不足する可能性あり。 変数の初期化や使い方などいろいろと問題あり。 一度最初からフローチャートを書くなどして再設計した方がいい。

Franz3
質問者

補足

>問題点1. 無限ループにして、ptrが指す場所を指定してから if(*ptr=='/'){ PrintNum(numbers,count); return 0; } のようにループを抜け出す方法も試してみましたが、同じような結果になります。 >問題点2. countをループ内で初期化すると、最初に格納した数字が消えてしまいそうな気がするのですが、よくわかりません。 >問題点3. すみません、line[50]は適当です。これもいろいろ変えてみました。 ほとんど素人みたいな者なので、根本的に間違ってるのかもしれないです。最初からやり直すとしても、見通しがつかないので困っています。 回答ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

Franz3
質問者

補足

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