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

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

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

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

Q&A

解決済

4回答

2726閲覧

コンパイルするとエラーが発生する。

torimoti

総合スコア5

C

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

0グッド

0クリップ

投稿2020/08/30 07:21

編集2020/08/30 07:48

./〇<〇.txtでテキストファイル〇.datを読み込んでテキストファイル内の数字、空白、改行、その他の文字の数を表示するプログラムを書きたいのですが、コンパイルすると以下のエラーメッセージが表示されてしまいます。
コードの何処がおかしいのか教えて頂けないでしょうか。

7.c: In function ‘main’:
7.c:8:16: error: too many arguments to function ‘getchar’
8 | while((f = getchar(fp)) != EOF){
| ^~~~~~~
In file included from 7.c:1:
/usr/include/stdio.h:492:12: note: declared here
492 | extern int getchar (void);
| ^~~~~~~
7.c:9:26: error: expected expression before ‘>’ token
9 | if(f>='0' && '9'=>f) d++;
| ^

c

1 2#include <stdio.h> 3 4int main(void){ 5 int ch,f; 6 int d=0,o=0,nl=0,s=0; 7 FILE *fp; 8 9 while((f = getchar(fp)) != EOF){ 10 if(f>='0' && '9'=>f) d++; 11 if(f==' ') s++; 12 if(f=='\n') nl++; 13 if(f!=' ' && f!='\n') o++; 14 } 15 16 printf("%3d digit\n%3d spaces\n%3d new lines\n%3d others\n",d,s,nl,o); 17 return 0; 18} 19

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

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

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

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

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

guest

回答4

0

エラーメッセージはとりあえず、読んでみると原因が書かれてます。
英語なんて読めなくても、単語だけでも調べればだいたいわかります。

7.c:8:16: error: too many arguments to function ‘getchar’

8 | while((f = getchar(fp)) != EOF){

too many(多すぎる) arguments(引数) to function(関数) ‘getchar’

「getchar関数の引数が多い」というエラーなので、getchar関数の仕様を確認してみます。
すると、

getchar

int getchar(void);
標準入力 (standard input) から 1 文字単位で文字を読み取ります.

と書かれているので、引数は必要ありません。そして、説明に書かれているとおり、
stdioからの入力を受け取るのがgetcharです。

ファイル情報をfpの中に入れたくてFILE *fpとしましたが、なにか不味かったでしょうか…?

getcharでは、それはできません。

/usr/include/stdio.h:492:12: note: declared here

492 | extern int getchar (void);
| ^~~

あ。エラーメッセージの続きにも、getcharの定義はこれだぞ。って親切に書いてありました。


7.c:9:26: error: expected expression before ‘>’ token

9 | if(f>='0' && '9'=>f) d++;

expected(予期する) expression(式) before(前に) ‘>’ token(単語)

>の前に式を予期しました。

>の前に式が必要です。

何かというと、このぶぶん。'9'=>f コンパイラは頭からコードを読んでいって、要素ごとに分解します。
この内容であれば、こうです。
'9'(リテラル) =(代入演算子) >(比較演算子) f(変数)
以上の4っつに分解したうえで、
代入演算子=の定義は、『式 = 式』という形になっているので、
=の次には、式が来ることを、予期した(expected)のですが、
なぜかその次に書かれているのは、>という演算子です。
これでは、演算ができませんので、

(=の次には)「式を予期したのに、その前に>が来ちゃったよ。ナニコレ?」

というエラーになっています。

原因はというと、=>という演算子はC言語にはありません。
その直前で書いているように、>=と書きます。
それであれば、コンパイラはきちんと、

'9'(リテラル) >=(比較演算子) f(変数)

と解釈できます。

投稿2020/08/30 10:24

amiya

総合スコア1218

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

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

torimoti

2020/08/30 11:27

とてもわかりやすい解説ありがとうございます。大変助かりました。 ご指摘の点をしっかりと意識してエラーメッセージもある程度読めるようになりたいと思います。
guest

0

とりあえず一点
× '9'=>f
○ '9'>=f

あと、このままだとotherで
数字が再カウントされますね。

投稿2020/08/30 09:58

編集2020/08/30 10:19
hana_yama_san

総合スコア923

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

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

torimoti

2020/08/30 10:06

確かに仰る通り数字を再カウントしてしまっておりました。 適切な助言ありがとうございます。
guest

0

コンパイラさんは、とにかく文法解釈の余地があるならとにかくソースを読み進めます。で、どうしようもなくなった段階で初めて悲鳴(エラー)をあげます。

つまり、ソースコードに何かの間違いがあった時に、「その結果として」どうにもならなくなったところがエラーメッセージの場所で、つまり「間違い」そのものはエラーメッセージより少し(あるいはだいぶ)前にある、というのは普通にあることです。

今回であれば、ソースを読み進めていって、8行目先頭の'while'に出会ったところで、文法的には‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ がなければおかしいのに'while'が出てきちゃった...と文句を言っているわけで。つまり、whileが間違っているわけではなく、File *fpからwhileにつながったところに問題がありそう、ということになります。
そういう目で見ると、File *fpの後に;がないんだ...というのに気がつけるんじゃないかと思います。

それと、時々「合っている/間違えていないはずなのにエラーが出る」と主張する人がいます。コンパイラのバグだとでも言いたいのでしょうが(質問者さんのことではありませんが)。世界中の人たちが散々使い倒しているコンパイラに、初心者がホイホイと見つけられるバグが残っている可能性はとても低いです(え? internal error? いや、それは...)。エラーが出るとか期待した動きをしない以上は自分がどこか間違えているはず、と思って間違いを探さないと、目の前にある間違いも見えなくなってしまいますのでご注意ください。

投稿2020/08/30 07:53

thkana

総合スコア7703

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

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

thkana

2020/08/30 07:57

書いてるうちに話はどんどん進んじゃった。 もう少し自分でも悩もうよ... エラーが出るたびに全部ここで聞く気?
torimoti

2020/08/30 08:18

度々すみません。 このプログラムですが、微力ながら2~3日程かけ、調べながら作ったものになります。 また、回答頂いてる合間には実際に調べています。 ただ、理解しようとは思っているのですが、此方で聞いた方が求めている回答を得られるため甘えてしまった節はあります。 お目汚しになってしまった事に関しては本当に申し訳ないです。
guest

0

ベストアンサー

FILE *fp

末尾の ; を忘れてます。

投稿2020/08/30 07:37

episteme

総合スコア16612

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

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

torimoti

2020/08/30 07:45

ほんとですね… ありがとうございます!
torimoti

2020/08/30 07:48

指摘頂いた箇所訂正してみましたがまだエラー表示が出てしまいます…
episteme

2020/08/30 07:52 編集

- getchar() は引数を取りません。 - '9'=>f はマチガイ。正しくは '9'>=f
torimoti

2020/08/30 08:25

なるほど… では、fpを活用するにはgetchar以外を用いる必要性があるということでしょうか?
episteme

2020/08/30 08:27

いや活用ってゆーか、そもそもそのfpは何のため?
torimoti

2020/08/30 09:26

ファイル情報をfpの中に入れたくてFILE *fpとしましたが、なにか不味かったでしょうか…?
kazuma-s

2020/08/30 09:59

「C FILE」や「C getchar」などでググって、どうやって使うのかを調べてみようとしないのでしょうか?
torimoti

2020/08/30 10:09

>>kazuma-sさん 自分なりに調べたりはしているのですが、何分理解力が足りず使い道がいまいち把握出来ていません。 此方で質問させて頂くと望む回答が得られるため甘えていた節があります。 確かに不快な思いをされる方はいらっしゃると存じます。お目汚し大変申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問