• ベストアンサー

fgets

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

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

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

fgets()ならエラーは出ません。 ちゃんと19文字(※)だけ取った上でそれを出力します。 ※20文字目は終端文字'\0'が入るため、入力できるのは19文字

armpoint
質問者

お礼

ありがとうございます。 もっと複雑なプログラムで 問題点は他にありました。 申し訳ないです。

その他の回答 (1)

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.2

エラーするって言い回しはしないので、 エラーになる・ならないで回答します。 このプログラムは、エラーにならないのでは? プログラムを書いて、実行してみましたか? 20文字以上入力したとしても、19文字目までの入力と'\0'が 配列に格納され、最後のprintf文で19文字表示されるのではないでしょうか?

armpoint
質問者

お礼

ありがとうございます。 しっかりと理解できていない点がありましたので 整理できました。

関連するQ&A

  • fgetsについて

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

  • 出力制限

    c言語初心者です。 fgets(a,71,stdin); を使います。 このaを三回連結させます。 そして printf("%s",a); で三回連結させたのを210文字で出力したいのです。 しかしどのようにして250まで出力させる制限をつけるのかがわかりません。 どなたかおしえてください。私のやり方方だと70文字以上入力するとエラーしてしまいます。

  • gets fgetsについて

    対話式のプログラムを作成したのですが、fgetsのところで勝手に文字が入力されてるような処理になってしまい、こちら側から入力できません。 fgetsのところで通常通り入力できるようにするにはどうしたら良いのでしょうか? コードは以下のとおりです。 #include <stdio.h> #include <string.h> main() { int kazu; char sentaku[1]; char string[10]; printf("文字を入力してください\n"); /*文字入力要求のメッセージ*/ fgets(sentaku,1,stdin); /*確認時にenterを読み込まないようにfgetsで文字取得*/ sscanf(sentaku,"%d",&kazu); putchar(sentaku[1]); /*putcharを使ってmojiを画面出力*/ putchar('\n'); /*改行コードを出力*/ printf("ここから先に進みますか?-Y/N->\n"); fgets(sentaku,1,stdin); /*確認時にenterを読み込まないようにfgetsで対話する*/ sscanf(sentaku,"%d%",&kazu); if(sentaku[0]==121) /*入力した文字がyだった場合*/ { strcpy(string,"spring\n"); /*strcpyを使って変数に代入*/ putchar(string[0]); /*putcharを使って画面出力*/ putchar(string[1]); putchar(string[2]); putchar(string[3]); putchar(string[4]); putchar(string[5]); } }

  • C++におけるfgets??

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

  • fgetsについて

    いつも大変お世話になっております。 またしても基本的なことで恐縮ですが、教えてください。 『fgets()』を使って、標準入力ファイル(stdin)からの情報を読み込む場合、指定されたサイズ以上を入力すると、サイズを超えた部分が切捨てられて最後に'\n'が自動的に付加されると学習しました。 しかし、切り捨てられた部分はまだstdinに残るため、次回の利用でおかしな結果を招くようです。 そこで、stdinのバッファをクリアたほうが良いと思ったのですが、方法が分かりません。 どのようにすればよいでしょうか? 【例】 #include<stdio.h> #include<string.h>     char name[5]; printf("文字列を入力して下さい。>>"); fgets(name,sizeof(name)-1,stdin); printf("読み込み文字列:%s\n",name); このとき、キーボードから4文字入力するとstdinのバッファに'\n'が残ってしまい、5文字以上だと4文字目以降の文字と'\n'が残ってしまうようです。 また、最後に'\0'が付与されるなら、サイズ以上が切捨てられた際もname[4]に'\0'を代入しなくてもいいということでよいのでしょうか? 乱文になってしまい、申し訳ありません。 どうぞ教えてください。

  • 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と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を混同して使用すると、どこかの入力時に改行がバッファに残ってしまい、入力処理が飛ばされてしまいますか? 以上、よろしくお願いいたします。

  • 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; }

  • %sの使い方について教えてください。

    %sの使い方について教えてください。 char c[4] = "abc" printf("%s",c); この関数は%sでcのアドレス(&c[0])を読み込み、stdoutにそのアドレスを書込み、文字列abcが表示されると認識しています。 printf("%s",stdin); とすればstdinのアドレスがstdoutに書き込まれて標準入力が表示されると思っていたのですが、実際はprintf("%s",*stdin)としなければ出力されませんなぜでしょうか? 回答をよろしくお願いします。 もう一つ別件なのですが、printf("%d",sizeof *stdin); と入力すると、32と出力されます。 なので、stdinは32バイトの大きさだと認識したのですが、char型の文字が32文字以上を書き込むことができます。(scanf()で入力が失敗して32文字以上の文字をバッファに保管できるということです。) これはどういうことでしょうか、分かる方是非、回答をよろしくお願いします。

  • 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関数を使用すると不可能なのではないか?と思っています。 分かる方が居ましたらどうか教えて下さい。 よろしくお願いします。

専門家に質問してみよう