各行任意個の数字をスペースで区切って入力し、格納する数字は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行目以降も入力できることがわかったのですが、上のプログラムは何がまずいのかわかりません。教えていただけると幸いです。
No.4ベストアンサー
- 回答日時:
以下のようなことをしたいのだと思いますが、
%test
%10 15 20[ENT]
%30 /[ENT]
10
15
20
30
%
(%はプロンプトだと思ってください)
1行目の処理を終了した後、ptrはNULLになっています。
そのため
>while(*ptr!='/'){
ここの判定でアドレス0を参照してSegment Faultになるのでしょう。
なるほど!どこが悪かったかわかりました!!
ptrがNULLでないことを確認してから/を判定するようにすればプログラムが動きました。ありがとうございました。
No.3
- 回答日時:
> while(*ptr!='/'){
実行開始直後は、ptrがどこを指しているかわかりません。
その状態で、先頭が'/'かどうかを判定するのはまずいです。
この回答への補足
No.2さんへの補足の「>問題点1」のところにも書きましたが、この方法でも解決できないです。
具体的にどのようにすればよいのでしょう?
回答ありがとうございます。
No.2
- 回答日時:
問題点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]は適当です。これもいろいろ変えてみました。
ほとんど素人みたいな者なので、根本的に間違ってるのかもしれないです。最初からやり直すとしても、見通しがつかないので困っています。
回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語 3 2022/11/09 13:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正負を反転させて出力するプロ...
-
double型が正常に認識されてい...
-
C言語 While文(ループ)内の...
-
数字以外が入力されたらエラー...
-
プログラムC言語の整数の約数に...
-
C言語 逆ピラミッドの作り方
-
2進数の1の数を数える問題
-
4桁の数字以外を入力したらエラ...
-
ダメだ・・・分からない。while...
-
入力値が1以下、かつ数字以外の...
-
VBでの日付入力値のフォーマッ...
-
c言語でひらがなのしりとりをで...
-
scanfが2回使えない・・・?;
-
Eclipseでコマンドラインを入力...
-
プログラム(C)
-
C言語でのカレンダー作成
-
キーボード入力の終了につきま...
-
C言語 for文をつかって記号を表...
-
C言語でつるかめ算をするにはど...
-
プログラミング初心者です。 Py...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
正負を反転させて出力するプロ...
-
数字以外が入力されたらエラー...
-
プログラミング初心者です。 Py...
-
double型が正常に認識されてい...
-
java初心者です。入力されたの...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
C言語scanf_sで何故か2回入力に...
-
if文の条件にscanf関数を使うと…?
-
プログラミングの問題です 「金...
-
Linuxで入力待ちなしkeyread関...
-
ワードで文字を入力する時の変...
-
cout関数を使っているのですが...
-
batプログラム上で文字列を入力...
-
Userformの入力順序をタブオー...
-
scanf が無視されます
-
C言語 逆ピラミッドの作り方
-
gets_sがうまく動かない
-
Excel VBAで、Application.Inpu...
おすすめ情報