質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

2回答

1264閲覧

c言語が実行しても動作しません

K.M.PEANUTS

総合スコア40

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/05/11 17:47

編集2021/05/11 18:04

c

1#include <stdio.h> 2#include <stdlib.h> 3 4int main(void) { 5 struct point_list { 6 double x, y; 7 struct point_list *next; 8 }; 9 typedef struct point_list List; 10 List *listhead = NULL; 11 List *p; 12 FILE *fp; 13 double n1, n2; 14 15 if((fp = fopen("input_0407.txt", "r")) == NULL) { 16 fprintf(stderr, "File open error\n"); 17 exit(1); 18 } 19 20 while(1) { 21 fscanf(fp, "%lf %lf", &n1, &n2); 22 if(n2 == EOF) break; 23 p = (List*)malloc(sizeof(List)); 24 p -> x = n1; 25 p -> y = n2; 26 p -> next = listhead; 27 listhead = p; 28 } 29 30 p = listhead; 31 32 while(listhead != NULL) { 33 printf("(%lf, %lf) ,", p -> x, p -> y); 34 p = p -> next; 35 free(listhead); 36 listhead = p; 37 } 38 39 return 0; 40}

txt

1-4.5 3.0 2-2.0 -3.0 33.5 0.5 41.0 2.0

上のようなコードを書いてターミナルで実行しようとしたのですが、全く何も出力されません。理由をおしえてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/05/11 17:56

input_0407.txt の中身はどうなってますか? (if(n2 == EOF) があやしいですね…。)
hoshi-takanori

2021/05/11 18:13

input_0407.txt の最後に 0.0 -1.0 を追加したら動きましたよ。
dodox86

2021/05/11 22:29

デバッグ環境を整えてデバッグしましょう。要望通りに動かないたびに質問する訳にはいきませんね。
guest

回答2

0

全く何も出力されません。理由をおしえてください。

いうまでもなく、コンピュータはプログラムは書いてある通りに動いているのだけれど、そのプログラムが間違っている(あなたの期待する動作をするプログラムになっていない)から。

C

1 while(1) { 2 fscanf(fp, "%lf %lf", &n1, &n2); 3 if(n2 == EOF) break; 4 //<略> 5 }

プログラムが進むとここにたどり着いて、fscanfはまず-4.5と3.0を拾ってn1とn2の場所に入れて、2個のデータを取得したので戻り値2を返します(この値は捨てられます)。
n2は3.0になってEOF(大抵のシステムで数値-1としてマクロ定義)とは異なるのでbreakしません。

繰り返しで-2.0 -3.0を拾って<略>
...

繰り返しで1.0 2.0を拾って、
n2は2.0になってEOFとは異なるのでbreakしません。

繰り返しでデータがファイルの終わりに達したので、fscanf関数は戻り値としてEOFを返し(この値は捨てられます)、n1,n2の値は変更しません
n2は2.0のまま、EOFとは異なるのでbreakしません。

繰り返しで、データがファイルの終わりに達しているので、fscanf関数は戻り値としてEOFを返し(この値は捨てられます)、n1,n2の値は変更しません。
n2は2.0のまま、EOFとは異なるのでbreakしません。

以下ず~っと繰り返し。

与えたデータで出力が行われるプログラムではないことがおわかりでしょうか。

投稿2021/05/11 23:09

thkana

総合スコア7639

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

K.M.PEANUTS

2021/05/11 23:51

理解できましたありがとうございます。EOFは負の値で、通常の戻り値は読み取った項目数(正の値)であることを用いて該当のwhile文のループ条件をfscanf(fp, "%lf %lf", &n1, &n2) >= 0)としたところうまく動作しました。この条件の書き方は、良いもの(一般的)でしょうか?
cateye

2021/05/12 01:22

通常は、期待される復帰値(この場合は2)でなかったら、「異常」として処理します。
guest

0

まずはそれをどうやって実行させようとしているのか詳しく説明しましょう。
できない、だけではこたえようがないです

投稿2021/05/11 22:06

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2021/05/29 12:04

低評価: ただの修正依頼
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問