アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (4件)

以下のようなことをしたいのだと思いますが、


%test
%10 15 20[ENT]
%30 /[ENT]
10
15
20
30
%
(%はプロンプトだと思ってください)

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

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

お礼日時:2008/08/05 20:09

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



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

この回答への補足

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

補足日時:2008/08/05 19:47
    • good
    • 0

問題点1.


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

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

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

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

この回答への補足

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

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

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

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

補足日時:2008/08/05 19:29
    • good
    • 0

どんなエラーが出るんでしょうか?


「ptr が NULL である」とかいうオチではないですよね?

この回答への補足

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

補足日時:2008/08/05 18:33
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!