はじめに
char型の1桁の数値をint型にしたくていろいろ調べたけど、結局よくわからなかったので力ずくで解決した話です。
main.c
int i=1;
char chr='1';
printf("%d %d\n",i,chr);
このようなコードがあったとき、出力は1と49になり、等しくはなりません。
理由は1のAsciiコードが49だからです。
環境
- Visual C++ 2015 (cl.exe)
- SublimeText 3
コード
追記
@SaitoAtsushi さんから「chr-'0'とすればよい」と教えていただきました。
main.c
int i=1;
char chr='1';
printf("%d %d\n",i,chr-'0');
この出力は1 1
になります。
@SaitoAtsushi さん、ありがとうございました。
ここから下は力ずくで解決した話です。
あまり参考にしないほうがよろしいかと...
main.c
int ChartoInt(char chr)
{
switch(chr){
case '1':return 1; break;
case '2':return 2; break;
case '3':return 3; break;
case '4':return 4; break;
case '5':return 5; break;
case '6':return 6; break;
case '7':return 7; break;
case '8':return 8; break;
case '9':return 9; break;
case '0':return 0; break;
}
return 10;
}
こんなコードを書きました。
最後に
atoi()
という関数があるようなのですが、うまく動きませんでした。時間もあまりなかったのでこんな方法になってしまいました。
今回は1桁だったのでコードは短くて済んだのですが、桁が増えるとatoi()
を使う必要があると思われます。
追記
@shiracamus さんのコメントです。
atoi関数の引数は
char
ではなくchar *
です。つまり、文字ではなく文字列の先頭アドレスを引数に渡さなければいけません。
atoi()
がうまく動かなかったのは、引数に「文字」を渡していたのが原因でした。
@shiracamus さん、ありがとうございました。