• ベストアンサー

fgetsについて

C言語初心者です。わからないことがありまして。 おしえてください。 以下はプログラムの一部です。 ################################ char fi[50]; int r; fgets( fi, 50, stdin ); r = atoi( fi ); ################################ fgets( fi, 50, stdin );のとこで 50とstdinはどういう意味ですか? 50は50バイト以上でなくてはいけません、という意味ですか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.1

基本的なことが理解されてないようなので、入門書でちゃんと入門した方が良いと思います。 50は最大50バイトという意味です。 stdinは入力元を示します。この場合は標準入力。

zero-0
質問者

お礼

参考書をじっくり読んで勉強します。 回答ありがとうございます。

その他の回答 (3)

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.4

>fgets( fi, 50, stdin );のとこで >50 と stdin はどういう意味ですか?  ・No.1 さんのとおり stdin は、標準入力で、具体的にはキーボードです。  ・50 は、そこから( 50 - 1 )文字を取得、とプログラマが指定したものです。  ・fgets は、( 50 - 1 )文字を読み込む、または Enter キーに出会うまで読み込みます。 ご質問主旨と直接関係しませんが、  ソースでは、整数に変換していることから、数字列の入力を想定しています(先頭の正負記号含む)。 ★ char fi[ 50 ]; はそのままでよいのですが、fgets( fi, 50, stdin ); の 50 は、atoi の扱える範囲というのもあるので・・。  まあ、50 のままで、何桁まで入力と同じか出力して確認してみるのも。 ------------------------------------ なお、stdin の代わりに、FILE構造体へのポインタとすると、  例) fgets( cBuf, 256, fp );  ファイル fp から( 256 - 1 )文字を読み込むか、または復帰改行文字に出会うか、EOFになるまで読み込みます。  ・最後のもののみが、「キーボード」と違う点です。 ------------------------------------ 下のURLで確認して下さい。  fgets から f を取った gets 等の組み合わせが多くあります。  使い分けをどうするのか、調べてみるのも・・。  http://www.bohyoh.com/CandCPP/C/Library/index.html

zero-0
質問者

お礼

参考になりました、ありがとうございます

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.3

>50とstdinはどういう意味ですか? >50は50バイト以上でなくてはいけません、という意味ですか? char fi[50]; ここで「fi」という名前の領域を50バイト分用意しています。 fgets( fi, 50, stdin ); この関数の呼び出しで、「fi」という名前を渡していますが、 実際にはとりあえず、この位置から開始して使ってねという 情報に変わって渡されます。 #よく言われる、 #C言語における「配列のポインタへの暗黙の変換」です。 しかし、開始位置の情報から、その元の領域がどこまでなのか 区別することができません。したがって、開始の位置は 分かっていてもその領域をどこまで使っていいのかが 呼び出された関数側からは分かりません。 そこで、「fi」のサイズを関数に教えて、 渡した開始位置「fi」の領域は「50」バイトまでしか使わないでね。 という事を教えています。 stdinとはNo1さんがおっしゃっている通り、 標準入力の事を言います。 #一般のPCではキーボードからの入力が殆どです。 ポインタとか配列とか用語を なるべく使わないように、かなり噛み砕いて書いてみました 多少、語弊もあると思うので、あえて参考意見で。。。

zero-0
質問者

お礼

わかりやすいです。ありがとうございます。 次の授業でポインタやりますので参考になりました。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

> char fi[50]; ここで定義した50バイトと > fgets( fi, 50, stdin ); 第2引数の50が対応しています。

zero-0
質問者

お礼

ありがとうございます。

関連するQ&A

  • fgets

    c言語初心者です。 char s[20]; fgets(s,20,stdin); printf("%s",s); のようなプログラムで、 20以上の入力をしたらエラーしますよね? それをもし入力したとしてもエラーしないで、20文字出力させるようにしたいのですが何か方法はありますか? いろんなサイトを見たり本を読んでもわかりません。 ちなみにlinuxで使いたいです。

  • C++におけるfgets??

    文字列を入力するときに用いるfgets関数ですが、 C++において fgets(char *,n,stdin) と同等の動作をする関数を教えてください。 よろしくお願いします。

  • fgets関数を使用したときの文字あふれについて

    fgets関数を用いて文字列を入力し、その長さを測るプログラムを作っています。 #include <stdio.h> #include <string.h> #define MAX 256 int main ( int, char *[] ); int main ( argc, argv ) int argc; char *argv[]; { char buf[( MAX )]; while ( 1 ){ memset ( buf, 0, sizeof( buf )); fgets ( buf, MAX, stdin ); if( fgets == NULL ){ break; } printf("入力した文字列の長さは%dです\n" ,strlen( buf )); } return 0; } このプログラムでは、256までしか文字列の長さを測ることができません。 もしこのプログラムで256を超える文字列を入力してしまうと、文字のあふれが発生し、 「入力した文字列の長さは256です」 「入力した文字列の長さは(あふれた文字列の長さ)です」 とこのようになってしまいます。 このプログラムで256以上の文字を読み捨てて、 「入力した文字列の長さは(あふれた文字列の長さ)です」 を表示しないようにできるのでしょうか? また読み捨てた文字列の長さを知ることはできるのでしょうか? もしかしたらfgets関数を使用すると不可能なのではないか?と思っています。 分かる方が居ましたらどうか教えて下さい。 よろしくお願いします。

  • fgetsで配列に数字を入れる。

    C言語についての質問です。 配列の中にひとつずつ数字を入れたいと思っています。 char suuzi[16]; fgets(suuzi, sizeof(suuzi), stdin); のような感じで読み込ませてるのですが、数字で読み込まれず文字として読み込まれてるみたいです。 数字として配列にひとつずついれるにはどのようにしたらよいかどなたか教えてください。

  • fgetsとsscanf

    C言語の勉強をしております。 初歩的な質問なのかもしれないですが、 char buf[80]; char data[32]; fgets(buf,sizeof(buf),stdin); sscanf(data, "%s", buf); と、 fgets(data, sizeof(buf), stdin); は何が違うのでしょう? 他の質問内容やネットで探してみたんですが、基本的には組み合わせて使用されているみたいなんですが、必要性がわかりません・・・。 例えば、fgetsで構造体のメンバ(文字配列)へキーボードからデータを入力したい場合は、どちらで行うのが良いのでしょう? また、入力データが未入力かどうか判断させるには、 fgets(buf,sizeof(buf),stdin); if(buffer[0] == '\n'){   /* ループを抜ける */   break; } で良いですよね? ※関連している質問 http://oshiete1.goo.ne.jp/qa4438371.html あと、同じ処理内で、getsやscanfを混同して使用すると、どこかの入力時に改行がバッファに残ってしまい、入力処理が飛ばされてしまいますか? 以上、よろしくお願いいたします。

  • scanfの後のfgetsについて

    #include <stdio.h> int main(void) { char name[10]; int no; printf("ナンバーを入力してください: "); scanf("%d",&no); /* 35を入力 */ printf("文字列を入力してください: "); fgets(name,10,stdin); /*入力できない*/ return 0; } この例文だと、fgets関数が改行コードを読み取って、終了してしまい文字列入力が出来ないみたいなんですが、scanfの後にfgetsを使うような(scanfとfgetsの間にscanfの残した?改行コードを取り除く方法)処理はどのような方法があるのでしょうか? 試しにfgets文を2度書いたら思っていた動作をしてくれたのですが、はたしてfgets文を2度書くというような事をしていいものなのでしょうか?見た目もなんだか変な感じですし。。↓ #include <stdio.h> int main(void) { char name[10]; int no; printf("ナンバーを入力してください: "); scanf("%d",&no); /* 35を入力 */ printf("文字列を入力してください: "); fgets(name,10,stdin); fgets(name,10,stdin);  /*入力できる*/ return 0; }

  • fgetsでエラー

     C言語を勉強しているものです。 fgetsやfscanfで第一引数にダブルポインタ変数を用いるとエラーが出ます。 なぜそうなるんでしょうか? ダブルポインタだと不可能なんでしょうか? char **moji; FILE *fp; moji = (char**)malloc(sizeof(char*) * 128 * 256); fp = fopen("test.txt","r+"); fgets(moji[0], 26, fp); //ここでエラー mojiを[0]で指定してあげてもエラーなんでしょうか? fgetsだけでなくfscanfでもそうです。 どうしてそうなんるんでしょう?

  • c言語のscanfとfgetsについて

    2つの単語A, Bを入力して、AがBに含まれるか否かというプログラムで 以下のようなものを作成しました。 そこで質問なのですがscanf()をfgets()に変えるとうまく動作しません どこが間違ってますか? 変更したいfgets fgets(key, sizeof(key), stdin); fgets(word, sizeof(word), stdin); ------------------------------------------------- int main(void) { char key[101], word[101]; scanf("%s", key); scanf("%*c%s", word); if (strstr(word, key) != NULL) { printf("Find %s In %s\n", key, word); } else { printf("Not Find\n"); } return 0; }

  • fgetsなどのときのstdinのバッファを消すには?

    こんにちは,今C(C++でない)を使用しています。 たとえば, char str[20] fgets(str,sizeof(str),stdin) としたときに20字以上を打つと,stdinのバッファに20字以上の分が残ったままになります。 C++などでは fflush(stdin)で,うまくいきますが,普通のCでは対応がされていないみたいでうまくいきません。 よろしくお願いします。

  • C言語におけるfgetsを用いたループ処理について

    C言語において、文章を読み込むためにfgetsを用いて下記のプログラムを書いたのですが、*において入力を受け付けなくなります。 これを解消する方法はないでしょうか? ちなみにコンパイラはBBC、開発環境はVistaです。 なお、簡略のため#include,main等は省略しています。 //以下プログラム #define SIZE 16384 char moji[SIZE] = {""}; char buf[SIZE]; //EOF(^Z)になるまで、文字列を受け取る while(fgets(buf, sizeof(buf), stdin) != NULL){ if(sizeof(moji) < strlen(moji) + strlen(buf)) break; strcat(moji, buf); }; getchar(); //* //プログラムここまで

専門家に質問してみよう