タグ

2011年3月28日のブックマーク (3件)

  • C: scanf()関数の連続使用は注意

    scanf()関数は文字列を読み込む関数ですが、以下のように2回連続で使うと、(プログラマが意図した通りには)うまく動いてくれません。 char c, *str; printf("文字列を入力してください: "); scanf("%s", str); printf("文字を入力してください: "); scanf("%c", &c); scanf()関数は、入力された文字を一度バッファに溜め、そのデータを読み込みます。 さらに、%sを指定すると、空白やタブ、改行文字などは読み込みません。 上記の例でバッファに溜められるのは'a''b''c''\n'という4文字分がバッファに溜まっています。 すると、1つ目のscanf("%s")では"abc"という文字列が変数*strに代入されます。 が、まだ改行'\n'がバッファに残っているのです。 そして2つ目のscanf("%c")がバッファに残ってい

    Fernweh
    Fernweh 2011/03/28
  • [迷信] scanf ではバッファオーバーランを防げない | 株式会社きじねこ

    株式会社きじねこは大阪のソフトウェア開発会社です。組込み系・業務系のプログラム開発から電子回路の設計までおまかせください。 これも根が深い迷信です。この迷信を根拠に、scanf は使うべきではないという人も大勢います。おそらくこういうことでしょう。 char s[10]; scanf("%s", s); 確かにこれでは、ユーザーが10文字以上入力した時点で未定義の動作を引き起こしてしまいます。しかし、これは書式指定が不適切なために発生する脆弱性であって、scanf の問題ではありません。 バッファオーバーランを回避するには次のようにします。 char s[10]; scanf("%9s", s); これで差し当たっての問題はなくなりました。 さて、熱心な迷信の信者は、何とかして scanf の名誉回復を阻むために、巧みに論点のすり替えを行いながら、scanf を貶めようとすることでしょう。

  • C言語講座

    前回の予定から行くと、今回は構造体のメンバに文字列の入った物の説明をする予定でしたが、前回までの章を見ていただければ、容易に想像がつきそうなのでやめにして、「ポインタを制する!!」の締めくくりとして、2重ポインタを示してポインタ論を締めくくりたいと思います。 2重ポインタとは、あるポインタ変数のアドレスを指すポインタ変数です。「は?」ですか・・・?プログラムを実行するに当たって、ある変数がメモリ上の領域に割り当てられたとします。その領域を格納することが出来る変数をポインタと言いましたが、その、ポインタのアドレスを格納することの出来る変数が2重ポインタです。下のサンプルを見て下さい。 int a; int* b; int** c; b = &a; c = &b; このようにしたとき、「*b」は「a」の値を表しますが、「**c」も「a」の値を表します。ちなみに、「*c」は「a」のアドレスを表し

    Fernweh
    Fernweh 2011/03/28