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関数を使用すると不可能なのではないか?と思っています。
分かる方が居ましたらどうか教えて下さい。
よろしくお願いします。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
fgetsの仕様は確認されていますか?
fgetsは読み込んだ改行文字'\n'をバッファに格納します。
改行文字'\n'が格納されないのはバッファから溢れた場合とEOFに達した場合です。
また、
>printf("入力した文字列の長さは%dです\n" ,strlen( buf ));
strlen()の戻り値の型はsize_tです。
sizeof(int) == sizeof(size_t) とは限りませんから"%d"では環境によって正しく出力されない事もありますし、たまたま正しく出力されてるように見えてるだけの事もあります。
No.4
- 回答日時:
fgetsは行末の改行をバッファに読み取ります。
このため,
buf[strlen(buf) - 1] == '\n'
が成立する場合は行末まで読み込んでおり,成立していない場合は読み残しがある状態になります。
「その行内で読んだ文字数」を保持する変数を一つ用意して,fgetsで読み込んだ文字数を追加していき,
行末まで読んだ場合にその変数の内容を出力して変数の内容を0にすることで,今回の問題に対処することができます。
ただし,最終行に改行を必要とするかはimplemation-definedであるため,それへの対処として,
ループを抜けた時点で上記変数が0でなければ,文字数を出力する必要があります。
No.3
- 回答日時:
対処としては既に回答があるのでいいとして…。
>int main ( int, char *[] );
main()のプロトタイプ宣言って必要でしたかね?
>int main ( argc, argv )
>int argc;
>char *argv[];
>{
かなり古い記述方法ですが、使用しているコンパイラと参照している資料はいつのものです?
>if( fgets == NULL ){
>break;
>}
ここのif文の意図を説明できますか?
おそらく勘違いしている可能性が高いので。
# fgetsのポインタがNULLだったらここまで到達出来ないので、何を判定すんのかなぁ…と。
No.2
- 回答日時:
fgetsは
・可能なら改行文字まで読み込む
・文字数が多い場合は、途中で切れる
・どちらの場合も、文字列終端の'\0' は付加される
という特徴があります。
「最後の文字を調べて、改行文字でなければ、途中で打ち切られたと判断して、(続きを読む等の)処置をする」というのが常套手段です。
そのようにするなら、自前で読み込むようにするか、fgetsを使わずにgetchar等を使って一文字ずつ確認するようにするか、でしょう。
ところで、本当に256でしたか?
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
ロボットの住む世界で流行ってる罰ゲームとは?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
fgetsなどのときのstdinのバッファを消すには?
C言語・C++・C#
-
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
C言語 exitの使い方
C言語・C++・C#
-
-
4
fgets()の仕組みについてくわしくおしえてください
C言語・C++・C#
-
5
関数から配列を返すには?
C言語・C++・C#
-
6
数字以外が入力されたらエラー文を出したい。
C言語・C++・C#
-
7
C言語のポインターに関する警告
C言語・C++・C#
-
8
ファイルから読み込んだデータを構造体に格納できますか?
C言語・C++・C#
-
9
C言語初心者の質問失礼します。
C言語・C++・C#
-
10
空白を含んだ文字列がうまく格納(表示)できない
C言語・C++・C#
-
11
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
12
fopne で失敗する原因
C言語・C++・C#
-
13
ファイル内のデータを1行削除する方法
C言語・C++・C#
-
14
ファイル書込みで一行もしくは部分的に上書きする
PHP
-
15
fgetsでバッファ残留文字列を無視して読み込む
C言語・C++・C#
-
16
c言語のポインタへの文字列入力についてです。
C言語・C++・C#
-
17
switch の範囲指定
C言語・C++・C#
-
18
構造体の勉強中です 合計点の高い順に並べ替えがわかりません
C言語・C++・C#
-
19
C言語で今まで表示していた画面の消すには?
C言語・C++・C#
-
20
C言語での引数の省略方法
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ある文字列で2回目3回目に出現...
-
itoaわかりません
-
sscanfとscanfの違いがよくわか...
-
文字の入れ替えについて
-
メニューバーでクリックした個...
-
charと%c , %s の関係について
-
単語数のカウントについて
-
VBで全角文字の上位コードを...
-
C言語のステップ数をカウントす...
-
CStringのFindで文字列検索を行...
-
大学のプログラミング課題について
-
putsとputcharの違い?
-
エディットボックスに入力され...
-
反転した数値を表示させるやり方
-
getchar分を用いて入力された文...
-
2÷3などの余りについて
-
複数桁10進数の*桁目だけを抽出...
-
マイナスからプラスへ転じた時...
-
10個出力で改行したいのですが...
-
信頼区間の1.96や1.65ってどこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
C言語 空白の行(改行のみ)が...
-
C言語のステップ数をカウントす...
-
C言語で16進数文字列から16進数...
-
itoaわかりません
-
fgetsで拾われる改行文字を削除...
-
fgets関数を使用したときの文字...
-
文字列中に含まれる文字の個数...
-
charと%c , %s の関係について
-
Cで「大文字、小文字の判定」は...
-
反転した数値を表示させるやり方
-
fgetsとsscanfを使って一行から...
-
エディットボックスに入力され...
-
小文字のみを数える方法
-
スペースで区切って数字を入力
-
CStringについて
-
C言語、単語ごとに改行したい
-
C言語 strlen 再入力を促す
-
教えていただけませんか?C言語...
おすすめ情報