MW211 EXIT

devlog
C/フォーマット指定子(数字付)・番外編
2012年11月10日
さて、これまでのまとめを踏まえて以下はいったいなんなのか?
┌──────────────────────────────────────┐
│%0d                                                                         │
└──────────────────────────────────────┘
「整数部の最小桁数が0」と認識されるのか?
「ゼロパディングだけどその桁数は0」と認識されるのか?
はたまたどちらでもないのか?

実際に実験してみたところ「%d」と変わらなかった。

空文字になるかと思ったがそんなことはなかった。
「%2d」に「123」を入れても「123」になるのと同じだしね。

「0」の場合「0」になるのだから、ゼロパディングが効いているのか?と思ったが
「%d」でも「0」の場合は「0」だった。
だいたいゼロパディングの桁数が0なんだから、「0」とか関係ないし。。。

っていうか「%01d」でも同じじゃないか。

ということで
┌──────────────────────────────────────┐
│「%d」=「%0d」=「「%01d」                                                 │
└──────────────────────────────────────┘
と見てよろしいのでしょうか?
分類:C/C++
C/フォーマット指定子(数字付)
2012年11月09日
だいたい、以下をおさえればよい。後はこれの組み合わせ。
┌──────────────────────────────────────┐
│%2d                                                                         │
└──────────────────────────────────────┘
整数部の数字は整数部の表示領域の桁数を表す。
上記の場合だと、「12」「 1」となる。
ちなみに三桁だとこれを無視して「123」となる(切り捨てられた方が怖いか)。

┌──────────────────────────────────────┐
│%-2d                                                                        │
└──────────────────────────────────────┘
あまり使わないかもしれないが、上記における「 1」を「1 」、
つまり左詰めにしたい場合は「-」を付ける。
ちなみに負の符号(マイナス)は特に指定しなくても勝手に表示されるから
「-」という記号はこの用途に使えているようだ。

┌──────────────────────────────────────┐
│%+d                                                                         │
└──────────────────────────────────────┘
逆に正の符号(プラス)は普段は表示されないものなので、敢えて表示したい場合には
指定が必要で、そのものずばりの「+」でOK。

┌──────────────────────────────────────┐
│%02d                                                                        │
└──────────────────────────────────────┘
先頭に「0」を付けるとゼロパディングとなる。「01」とか「00」とかだ。
「12」とか「123」とかは前出同様に勝手に表示される。

┌──────────────────────────────────────┐
│%.2f                                                                        │
└──────────────────────────────────────┘
小数点以下の数字は、小数部の桁数を表す。「1.23」「4.00」みたいな感じだ。

┌──────────────────────────────────────┐
│%.0f                                                                        │
└──────────────────────────────────────┘
小数点以下はいらない、整数部だけでよいという場合は「0」を指定してしまえばよい。
ちなみに、小数部はデフォルトでゼロパディングなので
整数におけるゼロパディング指定的なものが不要ということになる。
分類:C/C++
C言語/続・アライメントサイズの確認
2012年11月08日
┌──────────────────────────────────────┐
│struct {                                                                    │
│    char  a;                                                                │
│    int   b;                                                                │
│} z;                                                                        │
│printf("%d", sizeof(z));  →8(1+空3+4)                                    │
└──────────────────────────────────────┘
のように、int型の直前にアライメント端数があると、空き地を設けてくれるわけだが
┌──────────────────────────────────────┐
│struct {                                                                    │
│    int   b;                                                                │
│    char  a;                                                                │
│} z;                                                                        │
│printf("%d", sizeof(z));  →8(4+1+空3)                                    │
└──────────────────────────────────────┘
実は、構造体の末尾でも同じことがいえる。

つまり、構造体のサイズはアライメントの倍数であることが保証されるわけだ。

よって、以下の数式で構造体配列の配列数を正しく求めることもできる。
┌──────────────────────────────────────┐
│配列数 = sizeof(配列) / sizeof(配列[0]);                                    │
└──────────────────────────────────────┘
分類:C/C++
C/sscanf()の挙動
2012年11月07日
┌──────────────────────────────────────┐
│単語数 = sscanf(対象文字列, "%d,%d,%d", 取得A, 取得B, 取得C);               │
└──────────────────────────────────────┘
上記のような感じで、対象文字列が以下の場合の結果は
  ・「1,2,3」の場合  →単語数=3、取得A-B-C=1-2-3  正常な場合
  ・「1,2」の場合    →単語数=2、取得A-B-C=1-2-0  成功したところは取得できる
  ・「1,2,」の場合   →単語数=2、取得A-B-C=1-2-0  成功したところは取得できる
  ・「1,2,a」の場合  →単語数=2、取得A-B-C=1-2-0  成功したところは取得できる
  ・「1,,3」の場合   →単語数=1、取得A-B-C=1-0-0  成功したところは取得できる
  ・「1,a,3」の場合  →単語数=1、取得A-B-C=1-0-0  成功したところは取得できる
  ・「,2,3」の場合   →単語数=0、取得A-B-C=0-0-0  冒頭でこけたら全滅する
  ・「a,2,3」の場合  →単語数=0、取得A-B-C=0-0-0  冒頭でこけたら全滅する
  ・「」の場合       →単語数=0、取得A-B-C=0-0-0  空文字は例外とはならない
  ・「a」の場合      →単語数=0、取得A-B-C=0-0-0  該当なしも例外とはならない
  ・「1,2,3,4」の場合→単語数=3、取得A-B-C=1-2-3  実は正常な場合と区別できず
  ・「(NULL)」の場合 →例外発生
※取得A-B-Cは「%d-%d-%d」で出力したものです
分類:C/C++
C/フォーマット指定子
2012年11月06日
入力系フォーマット指定子
┌──┬───────────────────────────────────┐
│%c  │char型                                                                │
│%s  │文字列                                                                │
├──┼───────────────────────────────────┤
│%d  │整数(10進・符号あり)                                                  │
│%u  │整数(10進・符号なし)                                                  │
│%o  │整数( 8進)                                                            │
│%x  │整数(16進)                                                            │
├──┼───────────────────────────────────┤
│%ld │long型整数(10進・符号あり)                                            │
│%lu │long型整数(10進・符号なし)                                            │
│%lo │long型整数( 8進)                                                      │
│%lx │long型整数(16進)                                                      │
├──┼───────────────────────────────────┤
│%f  │小数                                                                  │
│%lf │double型小数                                                          │
└──┴───────────────────────────────────┘
他に「%e」「%g」もある

出力系フォーマット指定子
┌──┬───────────────────────────────────┐
│%c  │char型                                                                │
│%s  │文字列                                                                │
├──┼───────────────────────────────────┤
│%d  │整数(10進・符号あり)                                                  │
│%u  │整数(10進・符号なし)                                                  │
│%o  │整数( 8進)                                                            │
│%x  │整数(16進)                                                            │
├──┼───────────────────────────────────┤
│%hhd│char型整数(10進・符号あり)                                            │
│%hhu│char型整数(10進・符号なし)                                            │
├──┼───────────────────────────────────┤
│%hd │short型整数(10進・符号あり)                                           │
│%hu │short型整数(10進・符号なし)                                           │
├──┼───────────────────────────────────┤
│%ld │long型整数(10進・符号あり)                                            │
│%lu │long型整数(10進・符号なし)                                            │
│%lo │long型整数( 8進)                                                      │
│%lx │long型整数(16進)                                                      │
├──┼───────────────────────────────────┤
│%f  │小数                                                                  │
│%lf │double型小数                                                          │
└──┴───────────────────────────────────┘
分類:C/C++
設計/小数部を含む整数の用語定義
2012年11月05日
「123」とかのことを「整数」と記載した場合、
「123.45」とかのことをなんと記載しようかと悩んだ。

「0.45」って小数部が付いてるから「小数付整数」?
いやいや「小数点付整数」?

なんかしっくりこない。

そこで本格的に調べてみた。

結論は…。


「小数」


え?
「小数」ってのは「整数部+小数点+小数部」のことらしい。
「小数」と聞いてなんとなく思い浮かぶ「0.1」とかは、「純小数」といい、
我らが「123.45」(こいつは「帯小数」というらしい)と合わせて
「小数」っていうんだって。

なんだか、すげーあいまいなまま生きてきたんだなぁ。
分類:設計
C/【未解決】strlen()の柔軟性
2012年11月04日
やみくもに「strlen()」を使っていいものか?

末尾の「\0」を探してサイズを算出してくれるんなら
多少大目にサイズが算出されてもいいんじゃない?
#自分の領域にうっかり「\0」がなくても、
  となりの領域に「\0」があればそこまでのサイズを算出してくれそうだし。。。

でも、莫大なサイズだったらどうしよう?
#ってそんなに「\0」が続かない領域ってあるの?

っていうかたまたま全領域の末尾だったら「\0」がなくてってこともありうるなぁ
#全領域の末尾あたりで作業することってそんなにあるのかな?

ってなことを考えた。

もし仮に、「strlen()」をやみくもに使っていいのであれば、
なんだか出自の知れないポインタをとりあえず「strlen()」でサイズを計ってから
処理するってこともできるし。。。

でも、となりの領域に侵入した時点でアウトみたい。
#でも、実験したら場合によりけりみたいだけど(結論的にはアウトなんでしょう)。

正確な情報を知りたいものだ。
分類:C/C++、【未解決】
PostgreSQL/INSERT件数
2012年11月03日
「INSERT INTO 出力先 SELECT 入力元」みたいな、INSERT文を実行した場合、
実際に何件挿入されたか気になるところ。

実行直前と直後にそれぞれ「SELECT COUNT(*)」で件数を取得して差分をとるという
地道な方法以外に件数を簡単に取得する方法はないものか

PL/pgSQLだったら、以下で挿入件数を取得できる。
┌──────────────────────────────────────┐
│GET DIAGNOSTICS 変数(INTEGER型) = ROW_COUNT;                                │
└──────────────────────────────────────┘
分類:PostgreSQL
PostgreSQL/文字列をtimestamp型に変換する方法
2012年11月02日
┌──────────────────────────────────────┐
│SELECT TO_TIMESTAMP('2013-01-30 16:13:18','YYYY-MM-DD HH24:MI:SS');         │
└──────────────────────────────────────┘
みたいな感じ。

第二引数のYとかMとかは「書式テンプレートパターン」ってやつを参照のこと。

たいていは、その前にtimestamp型を文字列に変換していたりするので、
その逆をやればいいということになる。
┌──────────────────────────────────────┐
│SELECT TO_CHAR(NOW(),'YYYY-MM-DD HH24:MI:SS');                              │
└──────────────────────────────────────┘
分類:PostgreSQL
シェル/メッセージの抑止
2012年11月01日
┌──────────────────────────────────────┐
│ls 2> /dev/null                                                             │
└──────────────────────────────────────┘
lsコマンドで該当なしエラーメッセージを抑止する方法。

┌──────────────────────────────────────┐
│rm -f                                                                       │
└──────────────────────────────────────┘
rmコマンドで該当なしエラーメッセージや確認メッセージを抑止する方法。
分類:Linuxシェル
前へ 1 2 次へ