MW211 EXIT

devlog
C言語/文字型←→数値型(1)
2013年03月05日
文字型を数値型に変換するには以下の関数を使う。
┌──────────────────────────────────────┐
│int                 atoi(const char* 文字);                                 │
│long                atol(const char* 文字);                                 │
│long long int       atoll(const char* 文字);                                │
│double              atof(const char* 文字);                                 │
├──────────────────────────────────────┤
│long                strtol(const char* 文字列, char** 不正文字, int 基数);  │
│float               strtof(const char* 文字列, char** 不正文字);            │
│double              strtod(const char* 文字列, char** 不正文字);            │
│unsigned long       strtoul(const char* 文字列, char** 不正文字, int 基数); │
│long long           strtoll(const char* 文字列, char** 不正文字, int 基数); │
│unsigned long long  strtoull(const char* 文字列, char** 不正文字, int 基数);│
│long double         strtold(const char* 文字列, char** 不正文字);           │
└──────────────────────────────────────┘
a系は一文字が対象で、str系は文字列の一文字が対象。

逆に、数値型を文字型(文字列)に変換するには以下の関数を使う。
┌──────────────────────────────────────┐
│char*  itoa(int 数値, char* 文字列, int 基数);                              │
│char*  ltoa(long 数値, char* 文字列, int 基数);                             │
└──────────────────────────────────────┘
こちらはstr系(「ltostr」とか)はないみたい。
ま、a系で文字列を返してる(str系を兼ねている)しね。
分類:C/C++
C言語/数値型
2013年03月04日
数値型に関連するデータは以下の通り。
┌─────────┬──────────┬────┬─────────┬──┐
│signed char       │unsigned char       │ 1バイト│charは文字型専用  │ 2桁│
├─────────┼──────────┼────┼─────────┼──┤
│       short      │unsigned short      │ 2バイト│正式にはshort int │ 4桁│
├─────────┼──────────┼────┼─────────┼──┤
│       int        │unsigned int        │ 4バイト│ 2バイトの場合あり│ 9桁│
├─────────┼──────────┼────┼─────────┼──┤
│       long       │unsigned long       │ 4バイト│正式にはlong int  │ 9桁│
├─────────┼──────────┼────┼─────────┼──┤
│       long long  │unsigned long long  │ 8バイト│後から追加        │18桁│
├─────────┼──────────┼────┼─────────┼──┤
│       float      │unsigned float      │ 4バイト│                  │38桁│
├─────────┼──────────┼────┼─────────┼──┤
│       double     │unsigned double     │ 8バイト│                   308桁│
├─────────┼──────────┼────┼─────────┼──┤
│       long double│unsigned long double│ 8バイト│10バイトの場合あり 308桁│
└─────────┴──────────┴────┴─────────┴──┘
        ※(char型以外)「signed」は付けても付けなくても同じ
        ※桁数はフルに収まる桁数(もし「~127」ならば「~99」まで収まるから2桁)
分類:C/C++
C言語/isdigit()の引数がint型
2013年03月02日
「isdigit()」は「'0'~'9'」なら真(0以外)を返却し、
それ以外なら偽(0)を返却する便利な関数だ。

なのでその定義が「bool isdigit(char c);」とかと思ったら、
「int isdigit(int c);」なのだ。

ま、関数の型のintは、0からそれ以外で解釈するからいいとして
なんで引数はint型なの?

型に従って変換とかすると(「isdigit(atoi('1'))」みたいに)、偽になってしまう。

これは、数値の「0~9」は「0x00~0x09」で、
文字の「'0'~'9'」は「0x30~0x39」の違いがあって、
「0x30~0x39」なら真って判定しようと待ち構えていたら
「0x00~0x09」が入力されたのでアウト(偽)!って判定したってことらしい。

この場合は直接(「isdigit('1')」みたいに)でいいらしい。

なんだかややこしいC言語の世界。

int型は最速なんです、便利なんです、万能なんですってことなんだろうか。
ま、変換だなんだで時間をくうよりは少々わかりにくくてもダイレクトにってのが
C言語だからね(だからとっつきづらいし、罠が多い(覚えてらんないよ))。

つーから、マジマジと定義を見るまでint型に気づかなかった(反省)。
分類:C/C++
設計/エラー対処のパターン
2013年03月01日
エラーが発生した場合に対処するパターンとしては以下がある。

・気にしない                      →気にしなくていいのなら
・既定値だと解釈する              →そういうことも織り込み済みなら
・違う処理を試す                  →試す価値があるのなら
・入力や処理をやり直す(限度あり)  →何回かやればうまくいきそうなら
・再起動する                      →チャラにしたらうまくいくかもしれないなら
・上位に通知(継承)する            →自己解決できないのなら
・打ち切る                        →お手上げ

どれもエラーログとかに発生自体を記録しておくことになるであろう。
分類:設計
前へ 1 2 3 次へ