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

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

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

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

Q&A

解決済

3回答

1666閲覧

C言語 関数を勉強中

fermat

総合スコア183

C

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

0グッド

0クリップ

投稿2016/11/24 12:43

初心者です。C言語で関数を学んでいるのですが、教科書の読み方がよく分からないままとなっています。

例えば、fgets関数の紹介として

C

1char *fgets( 2 char *buffer, 3 int len, 4 FILE *fp);

というものがはじめに記され
サンプルプログラムは、以下の通りに書かれています。

C

1#include <stdio.h> 2int main() 3{ 4 char str[64]; 5 printf("文字列を入力してください--"); 6 fgets(str, sizeof(str), stdin); 7 str[strlen(str) -1]='\0'; 8 9 printf("入力した文字列は[%S]ですね\n", str); 10 return 0; 11} 12

紹介には、「charfgets()」とあるのですが、
サンプルでは「fgets()」という形で使われており、
プログラミング内でfgetsを文字列のポインタとして宣言(char
をつける)しなくて良いのだろうか?と
関数の使い方がよく分かりません。


サンプルプログラムにあるfgets(str, sizeof(str), stdin);の
「str」については、配列の先頭要素はアドレスを指すため、
fget関数の紹介として書かれていた
char *fgets(char *buffer,int len,FILE *fp);のうち、ポインタである
「char *buffer」の部分に相当するのだろう…というところまでなんとか読めている状態です。

詳しい方にはなぜこんなところで…と映るかもしれませんが、
どうぞよろしくお願い致します。

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

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

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

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

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

guest

回答3

0

こんにちは。

C言語で関数を使う時は3つの場面があります。

  1. 関数を呼び出すことを宣言する
  2. 関数の中身を定義する
  3. 実際に関数を呼び出す

「関数を呼び出すことの宣言」は、概ね、「関数の中身を定義」した人が書きます。
これはCコンパイラに対して、この関数はこのようにして呼び出すものであるということを伝えます。
そして、ついでにプログラマに対しても呼び出し方を教えることができます。
後者が「fgets関数の紹介として」に書かれている内容です。
引数や戻り値を定義しますが、実際に呼び出される時の値をこの段階で具体的に決めてしまったら、事実上使いものにならないので「型」を記述します。また、引数名は実は省略できるのですが、省略してしまうと説明し辛いので、どんな引数なのか分かるよう名前を付けます。

「関数の中身の定義」は省略しますが、fermatさんも書かれているmain()関数の記述はこれに該当します。

そして、「実際に関数を呼び出す」のが、 fgets(str, sizeof(str), stdin);です。
呼び出し方ではなく、実際に呼び出しているので全ての引数を具体的に与えます。

また、char *fgets()のchar*部分はfgets()の戻り値の型を定義していますが、戻り値は必ず受け取らなくては行けないというものではないため、このように戻り値を受け取らない書き方も許されます。

char *fgets(char *buffer,int len,FILE *fp);のうち、ポインタである

「char *buffer」の部分に相当するのだろう…というところまでなんとか読めている状態です。

初見でそこまで読めたら大したものです。

(書いている間にBA出てしまいましたが、折角書いたので回答しますね。)

投稿2016/11/24 13:01

編集2016/11/24 13:53
Chironian

総合スコア23272

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

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

fermat

2016/11/24 13:36

せっかちなBAをお許しください。 いつも詳しく教えて下さり、ありがとうございます。 書いていただいたことを、何度も何度も読んで勉強しています。 >char*部分はfgets()の戻り値の型を定義しています >戻り値は必ず受け取らなくては行けないというものではないため、このように戻り値を受け取らない書き方も許されます。 char * fgets()で戻り値が無い?という新たな疑問もこれで解決できました。 char *が付いていないから戻り値が無いのだろうか…などと危うく間違った理解をするところでした。 また前に進めそうです。ありがとうございました。
Chironian

2016/11/24 13:53

> せっかちなBAをお許しください。 いえいえ。素早いBAは好ましいものです。 あああ、敬称漏らしてました。ごめんなさい。
guest

0

C言語では、関数は戻り値というものがあります。

質問で書かれている、
char * fgets(char * buffer, int len, FILE *fp);
という表現は、char * 型の戻り値を返す。
という意味です。

fgets関数の仕様としては、エラーが発生した場合に、NULLを返し、
正常な場合は、 buffer を返します。

このサンプルプログラムはエラーが起きないことを前提にしている様ですね。
エラーをチェックするのであれば、以下の様に書きます。

char str[64]; char * p; p = fgets(str, sizeof(str), stdin); if (p != NULL) { // 正常な場合の処理 } else { // 異常な場合の処理 }

投稿2016/11/24 12:57

ShinyaAnan

総合スコア241

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

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

fermat

2016/11/24 13:08

>char * 型の戻り値を返す。 という意味です。 目からうろこで勉強になりました。 他の関数にも応用が効きそうで、意識付けて読み進めたいと思います。 ありがとうございます。
guest

0

ベストアンサー

プログラミング内でfgetsを文字列のポインタとして宣言(char*をつける)しなくて良いのだろうか?と

stdio.h の中で、char *fgets(~~); と宣言されています。

投稿2016/11/24 12:53

otn

総合スコア84423

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

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

fermat

2016/11/24 12:58

早くも回答していただき、ありがとうございます。 インクルードファイルのstdio.hの中で宣言されていれば、fgets();という形で呼び出せるんですね。 疑問が引っかかったまま勉強をしていたので、助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問