タグ

2011年2月25日のブックマーク (5件)

  • [迷信] double の出力書式は "%lf" | 株式会社きじねこ

    この迷信、ないしは事実誤認はあまりにも根が深く、あまりにも多くのプログラマが間違いを犯し続けるため、遂には標準規格の方が折れて、迷信を追認することになったという"暗い歴史"があります。 printf 系の関数で double 型の実引数に対応した書式指定は "%lf" ではなく "%f" が正解です。同様に、"%le" や "%lg" ではなく、"%e" や "%g" を使うのが正解です。 この迷信の元になっているのは、ほぼ間違いなく scanf 系関数の書式との混同です。そして、悪いことには、迷信を信じて疑わない人々が、さらにその迷信を部下や後輩や学生に広めているのです。 C/C++の仕様が分かるのであれば、少し考えれば printf 系関数の書式指定が float と double で区別する必要がないことは容易に理解できるはずです。すなわち、可変個実引数は、既定の実引数拡張によって

    urza358
    urza358 2011/02/25
  • プログラミング/小ネタ集/Unicode対応コーディング - ルーチェ's Homepage

    概要 † このコンテンツは、C/C++言語でWindowsプログラミングをしていて、かつMFCやATLにある CString クラスを使っていない人くらいにしか実益はないかもしれません。 が、内容的に知っておいて損はないことなので書いておきます。 概要としては、 LPTSTR 型や TCHAR 型について知り、NT系(Unicode環境)と9x系(非Unicode環境)のどちらにも最適化できるソースコードを書こうというお話です。 TCHAR 型を見たことがなくても、 LPTSTR 型なら見たことがある人も結構いるでしょう。 初心〜中級のWindowsプログラマは、大抵は LPTSTR 型と LPSTR 型の違いを特に意識せずにコードを書いています。 しかし、この二つの型を混同するのは非常に危険なことです。 まずはこれらの型の定義を説明し、 TCHAR 型を用いることでUnicode対応プロ

  • printf(msg) の危険度: uyota 匠の一手

    printf 系の関数に、単一の文字列を表示するために、そのまま文字列を渡す行為を良く見かける。これは、C/C++ 言語の中でも、極めて危険な行為だ。sprintf と fprintf の系統のどちらでも関係なく、かつこれらの派生関数にも一貫して言える。 printf(msg); はよく行われる。そして、C++ だと以下の様な例も見られる。 printf(obj.toString()); なぜこれが危険度大なのかと言うと、msg や toString() が% を含まないという保証が無いからだ。 例えば、SQL クエリ等、文法にて % の利用がある場合は、自殺行為以外の何物でもない。この様な、コードを書く者。この様なコードをコード査読の時に見付けない人々。そして、このコードでも動いていたと抜かすプロジェクトマネジャー等と関わった後は、これらの人々の評価を数段下げておいた方がいい。このような

    urza358
    urza358 2011/02/25
  • printf(buffer) の危険性: uyota 匠の一手

    他人が書いたプログラムを読んでいると結構目に付く。これは、極めて危険な操作だ。fprintf(stderr, buffer) も同じく危険だ。 FILE *Fopen(const char *path, const char *mode) { FILE *fd = fopen(path, mode); if(fd == NULL) fprintf(stderr, path); return fd; } 等とやるのが、よく見られる間違いだ。 FILE *Fopen(const char *path, const char *mode) { FILE *fd = fopen(path, mode); #if !DEBUG if(fd == NULL) #endif fprintf(stderr, path); return fd; } とやってみよう。デバッグしようと #define DEBU

    urza358
    urza358 2011/02/25
  • ポインタと文字列

    10-3.ポインタと文字列 普通ポインタを用いるときには、配列などのアドレスをポインタに設定して用いますが、 文字列の場合には、配列を使わずにメモリ上に取られた文字列のアドレスを直接ポインタに指定することができます。 (1)1つの文字列をポインタで表す (書き方) char *p = "ABC"; char *p; p = "ABC"; まずメモリ上のどこかに文字列 "ABC" がとられ、その先頭番地がポインタに設定される。