
いつも大変お世話になっております。
またしても基本的なことで恐縮ですが、教えてください。
『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'を代入しなくてもいいということでよいのでしょうか?
乱文になってしまい、申し訳ありません。
どうぞ教えてください。
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
よく誤解されるけど '\0' と NULL は違います.
規格上整定数0 は NULL として使えて, かつ '\0' は整定数0 なので NULL のところで '\0' を使っても正しく動作するんだけど, 概念的には別物 ('\0' は「文字コード0 の文字」, NULL は「ヌルポインタ = 何もささないことが保証されているポインタ定数」) です.
No.5
- 回答日時:
No.1 補足より
> 本当に'\0’が入ったかどうかは、どのように確認したらよいのでしょうか?
1文字ずつ数値で表示して、ASCIIコード表と照らし合わせてください。
'\0'の値は10進数だと0です。
http://e-words.jp/p/r-ascii.html
No.4さんの書式についてはこの辺を参考にしてください。
http://www.mm2d.net/c/c-01.shtml
この場合は、4文字だけバッファに取り込み、改行文字と超過分を読み捨てるようになっています。
yukimican様
いつも丁寧にご回答いただき、ありがとうございます!
早速両サイトを拝見いたしましたところ、無事に'\0'が入っていることを確認できました。('\0'は=NULLで'0'なのですね)
また、書式についても勉強になりました。
かねてからの疑問であった「*」は読み捨ての時に使う記号なのですね。これなら、文字数を制限できるので、とても便利です!
本当にどうもありがとうございました。
No.4
- 回答日時:
getsの代わりにfgetsを使えという場合が多いこともあって、単純に置き換えられると考えている人も多いようですが、fgetsをまともに扱うのも結構面倒なものです。
今回の場合、いっそのこと次のようにしてはどうでしょうか?
char name[5];
scanf("%4s%*[^\n]%*c", name);
この回答への補足
jacta様
ご回答をありがとうございます!
scanfですね!
教えていただいて恐縮なのですが、再度質問させてください。
書式設定の『"%4s%*[^\n]%*c" 』で、*と[^\n]は、一体どういう意味なのでしょうか?
調べてみたのですが、よく分からないのです…。
No.1
- 回答日時:
stdinのバッファをクリアするためには、
バッファが空になるまでひたすらデータ取得する必要がありますね。
詳しくはこのへんを見てください。
http://kitaj.at.infoseek.co.jp/fgets.html
http://kitaj.at.infoseek.co.jp/c_prog2.html
> また、最後に'\0'が付与されるなら、サイズ以上が切捨てられた際も
> name[4]に'\0'を代入しなくてもいいということでよいのでしょうか?
実際にいくつかテストパターンを用意して、それぞれの場合で
printfを使って取得した文字列を1文字ずつ(数値で)表示してみると
理解しやすいかと思います。
この回答への補足
yukimican様
丁寧なご回答をありがとうございます!
リンクしていただいたサイトを拝見し、とても勉強になりました。
教えていただいた通り、'\0'が付加されるかを確認するため簡単なソースをいくつか作ってみました。
要素数を変えて、読み込んだ文字列を表示しただけなのですが、何回か試したところやはり指定した読込み文字数より1文字少なく読み込まれることが分かりました。
しかし、最後に'\0'と表示されないのですが、本当に'\0’が入ったかどうかは、どのように確認したらよいのでしょうか?
たびたびの質問で申し訳ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- MySQL addcslashesの使い方について教えてください。 DBに繋げてそこから、部分一致させたいのです 1 2023/04/14 22:59
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgets関数を使用したときの文字...
-
putsとputcharの違い?
-
CStringのFindで文字列検索を行...
-
C言語:配列の中の文字を。。。
-
文字列の操作
-
atoiでの文字列以外のエラー処...
-
プログラムのことで
-
今回のC言語の質問は以下の内容...
-
単語数のカウントについて
-
文の意味
-
ある文字列で2回目3回目に出現...
-
CStringについて
-
sscanfとscanfの違いがよくわか...
-
構造体の各メンバにfor文からア...
-
「Aに対するBの割合」と「Aに対...
-
Enterキーを押されたら次の処理...
-
C言語での引数の省略方法
-
ラグランジュの補間法のCプログ...
-
10個出力で改行したいのですが...
-
複数桁10進数の*桁目だけを抽出...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
fgetsで拾われる改行文字を削除...
-
sscanfとscanfの違いがよくわか...
-
反転した数値を表示させるやり方
-
charと%c , %s の関係について
-
fgets関数を使用したときの文字...
-
Cで「大文字、小文字の判定」は...
-
strstrを利用しない文字列検索...
-
文字列中に含まれる文字の個数...
-
C言語のステップ数をカウントす...
-
itoaわかりません
-
C++
-
C/C++言語で日本語処理
-
C言語 空白の行(改行のみ)が...
-
CStringについて
-
小文字のみを数える方法
-
教えていただけませんか?C言語...
-
ブランクのチェック
-
str[j++]の意味
-
初歩的なプログラムなんですが...
おすすめ情報