- ベストアンサー
fscanf(),scanf()とBuffer Overflow
scanf("%s", buf); で、bufの長さはどれくらいに取ればよいのでしょう。 sscanf(buf,"%s",buf2); なら、sizeof(buf)以上に大きくならないでしょうが、scanf(), fscanf()で文字列を読み込むときは、Buffer Overflowの危険から逃れられないような気がしています。 私はそのため、文字列を扱うときには、この二つの関数を使わないでいるのですが、安全な使用方法はあるのでしょうか? scanf("%10s",buf); のような使い方は知っています。でもこれでは文字数が10文字だったのか、それ以上だったのか判別できません。知りたいのは最大文字数が未知の場合です。 こう使えば安全という使い方があればぜひご紹介ください。
- みんなの回答 (12)
- 専門家の回答
質問者が選んだベストアンサー
こんなのはどうでしょうか? if (scanf("%10s%c", buf, &c) < 2 || isspace(c)) puts("10文字以下だった"); else puts("10文字を超えてちょん切られた。"); あまりパッとしませんね。
その他の回答 (11)
- rentahero
- ベストアンサー率53% (182/342)
Cでは、安全でない関数は仕様上安全でないため、その関数をそのままで安全に使う方法はありません。 scanf(3)とfscanf(3)は、mktemp(3)やtempnam(3)ほど危険ではないにせよ、gets(3)と同程度には安全ではないです。 だからこそ、代替手法というのが確立している訳ですよね。
お礼
ありがとうございます。 しかし、その危険に気づかず何の気なしに使っている人は多いようで、このカテゴリの回答の中にも多数のscanf()を使った回答を見かけます。 【使ってはいけないC func】とか、【本当は怖いC func】などという本や、Web pageはないでしょうか? 無造作にgets(3), strcpy(3), sprintf(3)を例題として使っている本ならいくらでもありそうですが…
- 1
- 2
お礼
ありがとうございます。 なかなかよい案だと思います。ただ、10文字を超えていたとき次の読み込みで、文字列を繋ぎ修復する処理が厄介ですね。