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

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

ただいまの
回答率

88.93%

C言語 関数を勉強中

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 926

fermat

score 181

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

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

char *fgets(
   char *buffer,
   int len,
   FILE *fp);


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

#include <stdio.h>
int main()
{
    char str[64];
    printf("文字列を入力してください--");
    fgets(str, sizeof(str), stdin);
    str[strlen(str) -1]='\0';

    printf("入力した文字列は[%S]ですね\n", str);
    return 0;
}


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


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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

こんにちは。

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 22:36

    せっかちなBAをお許しください。
    いつも詳しく教えて下さり、ありがとうございます。
    書いていただいたことを、何度も何度も読んで勉強しています。

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

    char * fgets()で戻り値が無い?という新たな疑問もこれで解決できました。
    char *が付いていないから戻り値が無いのだろうか…などと危うく間違った理解をするところでした。
    また前に進めそうです。ありがとうございました。

    キャンセル

  • 2016/11/24 22:53

    > せっかちなBAをお許しください。

    いえいえ。素早いBAは好ましいものです。

    あああ、敬称漏らしてました。ごめんなさい。

    キャンセル

checkベストアンサー

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/24 21:58

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

    疑問が引っかかったまま勉強をしていたので、助かりました。

    キャンセル

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 22:08

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

    ありがとうございます。

    キャンセル

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る