• ベストアンサー

fgetsを使って入力した文字列を読み込む。

こんにちは。私は30代の男性です。 上司から、「C言語でコーディングする際にscanfは使わずにfgetsを使うように」との指示があったのですが、scanfしか使ったことがないので、具体的にどうコーディングすればいいのかわかりませんでした(聞いても教えてもくれず…)。どのようにすればfgetsを使って入力した文字列を読み取れるのか、わかる方がいらっしゃれば簡単な例文で教えて頂けるとありがたいのですが。 どうぞ宜しくお願い致します。

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

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

以下のプログラムは 典型的な誤りのあるプログラムです。 領域の無い部分に書き込みを行うため、 メモリ破壊を起こします。 #include<stdio.h> int main(){  char *str;  fgets(str,100,stdin);  puts(str);  return 0; } ↓修正後 #include<stdio.h> #define MAXSTRLEN (256) int main(){  char str[MAXSTRLEN];  fgets(str,MAXSTRLEN,stdin);  puts(str);  return 0; } このレベルであれば、解説されているサイトは いくつも存在します。 fgets関数の使いかた等も、 Googleなどで調べれば簡単に出てくるので そういったサイトを見ることをお勧めします。

DT50
質問者

お礼

ご回答ありがとうございます。 なるほど。「ありがちな間違い」ということなんですね。 参考にさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

scanfを使わずにfgetsを使うべしとする理由によって、紹介すべき用法も変わってきます。 例えば、scanfの場合は標準入力からしか読めないので、代わりに(なぜかfscanfではなく)fgetsを使うということなのか、プログラムサイズを小さくすることが目的なのか、パフォーマンスを向上させるためなのかということです。 もし、scanfで入力文字数の制限ができないと考えているのであれば、その上司がscanfの仕様を正しく理解していないだけです。 # 聞いても教えてくれない辺り、その可能性が大です。 実際のところはどうなのでしょうか?

DT50
質問者

お礼

ご回答ありがとうございます。 例えば、「数字を入れて欲しいところに文字列をいれられても、バグが発生しないようにするため。」とか言ってました。

全文を見る
すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★アドバイス ・http://oshiete1.goo.ne.jp/qa2921301.html→『テキストファイルからの読み込みについて教えてください』 ・http://oshiete1.goo.ne.jp/qa2897482.html→『電話番号を読み込むプログラムについて教えてください』 ・http://oshiete1.goo.ne.jp/qa2892528.html→『ファイルの中身検索と表示』 ・http://oshiete1.goo.ne.jp/qa2886170.html→『CSVファイルの内容を構造体に格納したい(Unix使用)。』 ・http://oshiete1.goo.ne.jp/qa2800259.html→『fscanfでループしてしまう。』 ・http://oshiete1.goo.ne.jp/qa2756391.html→『Cで二次元配列の読み込み』 ・http://oshiete1.goo.ne.jp/qa2749340.html→『fgetsなどをもちいて「改ページ」までの文字列を読み込みたい』 ・http://oshiete1.goo.ne.jp/qa2659290.html→『重複番号出力方法について』 ・上記の質問に fgets 関数が登場します。どんな場面でどのように使えば良いか分かると思います。  その他、上のQ&Aのやり取りから間違えやすい記述とか、いろいろと学べると思います。 ・以上。参考に!→このQ&Aで『fgets』で検索するといっぱい出てきますよ。

参考URL:
http://ohmoriws1.ms.kagu.tus.ac.jp/1997/sotsuken/miyakosi/c04.html
DT50
質問者

お礼

Oh-Orange様 いつもご回答いただきありがとうございます。 上記サイト、参考にさせて頂きます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
noname#33971
noname#33971
回答No.1

#include<stdio.h> int main(){ char *str; fgets(str,100,stdin); //ここで入力 puts(str); //ここで出力 return 0; } こんなんでいいですか?

DT50
質問者

お礼

ご回答ありがとうございます。 参考にさせて頂きます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 標準入力の際に、、、fgets

    標準入力の際にgetsやscanfは読み込むバイト数を指定できないので危険、 fgetsを使えという話を良く聞きますが、fgetsだと改行まで読み込んで しまいますよね。これで少し困っています。 読み込んだ文字列から'\n'を探して'\0'を代入することはできますが 面倒くさいです。もっと手軽にscanfのように改行を含めずに 標準入力から受け付けるのをfgetsなどではどうやればいいのでしょうか。 よろしくお願いいたします。

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

  • [c言語] 大きな文字列の入力

    scanfやfgetsで入力を使用としても4000文字程度までしか受け取らないのですが それ以上の長さの文字列を受け取りたい場合はどうすればいいでしょうか? よろしくお願いします

  • fgetsでバッファ残留文字列を無視して読み込む

    お世話になります。 早速質問させていただきます。 言語はC++です。 ファイルに、以下の文字列があったとします。 ============================ 123456789012 12345678901 1234567890 123456789 ============================ この時、 fgets( str, 10, fp); printf("str (%2d)= %s\n", strlen(str), str); を、EOFになるまで繰り返します。 すると、実施結果は ============================ 123456789 012 123456789 01 123456789 0 123456789 ============================ となります。 これは、fgetsで10というレングスを指定しているために、1行読み込んで、10文字以降の文字列はバッファに残ってしまっているため、 2度目のfgetsで、10文字以降の文字列が読み込まれ、書き出されているものと思われます。 この時、fgetsで1行読み込んだ後、バッファに残った文字列を無視し、2度目のfgetsで、2行目を読み込むにはどうしたらよいでしょうか? 有識者の方、ご教授ください。よろしくお願いします。

  • fgets関数とscanfについて

    fgets関数とscanfの意味が似ていると思うんですが、違いは何ですか? 例えば、fgets( str, 81, stdin ) は変数strに80文字制限で、標準入力から入力するという意味ですよね? scanf("%s",s)は変数sに文字列を入力するという意味ですよね? 意味が似てると思うんですが、実際は何が違うんでしょうか? 回答よろしくお願いします。

  • fgetsについて

    C始めて2ヶ月ほどの者です。 fgetsで入力された文字をエンターが入力されるまで取得するという事をしたいのですが、どうしたら良いでしょうか? 例で言うとfgets(**,32,**)として最後の\nを過ぎた分もまた取得したいです。 この場合32文字を越えるごとに、その文字列をstrcatでくっつけるとかしたら出来そうかなと思ったのですがなかなか上手くいきません。 どのように考えたら良いのかご教授お願いいたします。

  • C++におけるfgets??

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

  • fgetsで拾われる改行文字を削除したい

    お世話になります  C言語初心者のものです。今課題でC言語を用いたプログラミングを Fedora上でやっています。問題は、fgetsでテキストファイルから、取得 した文字列の中から改行文字を削除できないことです。文字変数のアド レスはわかっているのですが、終端文字に置換しようとすると、セグメ ントエラーになってしまいます。これは如何にして解決すべきでしょう か。よろしくお願いします。

  • 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言語を今日から始めたじいさんです。 宜しくお願い致します。 メモ帳を使って3行ほどの文字列を入力して、text.txtファイルに保存します。 この文字列を読み込んで、1行ずつ印刷しようとしていますが fgetsでtxtファイルの終了条件がわかりません。 while(fgets(row , sizeof( row ) , fp) != NULL){ printf("%s\n , row); } fclose( fp ); return 0; のようにしているのですが、3行印字処理をして異常終了してしまいます。 本に出ている例をそのまま実行しているのですが、うまくいきません。 txtファイルをダンプしてみると各行の後ろに0d 0aたぶんCR,LFが入っていてNULL=00(?)はありません。テキストファイルの作り方に問題があるのでしょうか? それともfgetsの使い方に誤りがあるのでしょうか?