- ベストアンサー
標準入力の際に、、、fgets
標準入力の際にgetsやscanfは読み込むバイト数を指定できないので危険、 fgetsを使えという話を良く聞きますが、fgetsだと改行まで読み込んで しまいますよね。これで少し困っています。 読み込んだ文字列から'\n'を探して'\0'を代入することはできますが 面倒くさいです。もっと手軽にscanfのように改行を含めずに 標準入力から受け付けるのをfgetsなどではどうやればいいのでしょうか。 よろしくお願いいたします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>scanfは読み込むバイト数を指定できないので それはscanfの仕様を呼んでいない人の戯言です。 #4さんが書かれている通り、指定できます。 ちなみに書式指定子の仕様にsscanfもscanfも差異はありません。 入力ストリームが違うに過ぎません。 fgetsを使えというのはscanfの仕様に対する理解が少ないのと、 戻り値の判断の難解さから来るものだと思います。 どうしても、scanfなどの書式指定が信用できなければ fgetsで読み込み、自力で文字列を解析する以外に無いと思います。
その他の回答 (6)
- jacta
- ベストアンサー率26% (845/3158)
#4です。 scanf系の関数で一番問題なのは、文字列を入力する場合ではなく、数値を入力する場合です。 具体的には、 int value; scanf("%d", &value); というコードに対して、 9999999999999999999999999 を入力したとします。 もし、int型の表現範囲が-2147483648~+2147483647であれば、入力された値を格納することができませんので、未定義の動作になります。 これは、fgetsで読み込んでsscanfで解析したとしても何の解決にもなりません。
- galluda
- ベストアンサー率35% (440/1242)
がると申します。 んと…fscanを使う、って話は論外として(趣味なら可。仕事では絶対にNG)。 標準入力からの受け取りで、もちろん「改行を消したい」時もあるでしょうし、逆に「消されちゃ困る」時もあろうかと思います。 そういうときは、C言語なら、関数を一つ作るのがベストかと思います。 昨今のOOPですとクラスになるのですが。 まぁ#1さんと同一の見解なのですが。 あと、 > 改行を含めず入力を受け付けるというのは需要があると思うので ですが。 「改行を取り除いた上で文字列を配列で持ちたい」って需要は案外にあるのですが、単純に「改行コードを\0にする」というのは、一応この道で二桁の年数食ってますが、あんまり見ないですね。 C言語では\0は特別な意味を持たせてしまっているだけに、文字列の途中に\0がくるのは大変に危険なので。 以上現場からの雑感でした。
- jacta
- ベストアンサー率26% (845/3158)
scanfでも、次のようにすればできます。 char s[16]; scanf("%15s%*[^\n]%*c", s);
- rabbit_cat
- ベストアンサー率40% (829/2062)
fgetsでメモリに読んで、sscanfでスキャンする。
- isle
- ベストアンサー率51% (77/150)
勝手に改行コードが削除されたらどこまでで一行か分からなくなります。 常に読み込むバイト数以下の長さの文字列しか必要無い状況なら、 char str[16+1]; scanf("%16s", str); とか。 想定外に長い文字列を入力されたときの対処は自分で考えてネ。
・・・fgetsで\nを\0に置き換える物を作って使い回せば良いのでは? 使い回せる物を 一般的に「ライブラリ」と呼ぶ。
お礼
すばやいレスありがとうございます。 確かにそれもひとつの手ですね。ただ(メモリ的に)安全に、 改行を含めず入力を受け付けるというのは需要があると思うので 既に一般的な手法があるのではないかと思って。。。 ありがとうございまいsた。