C言語でchar型の数字からint型の数字に変換したときのメモ
やっていること
1. 入力した値を文字列として保存
2. 文字列を数値に変換
3. INT型の範囲にあるかをチェック
注) int型の範囲は一般に以下のように定義されているが、環境によっては異なる場合もあるので、一応、桁数をFOR文で数えている。
int の最小値 = -2147483648
int の最大値 = 2147483647
kadai.c
# include<stdio.h>
# include<limits.h>
# define NUMBER 100 // 入力できる文字は100桁までとする(変更可)
// プロトタイプ宣言
int str2value(const char moji);
// main関数
int main(void){
int i; // カウンタ
int num=0; // 入力された文字列の文字数保存用
int int_max=INT_MAX; // INT_MAXの桁数確認用
int max_num=0; // INT_MAXの桁数保存用
int flag=0; // 記号の有無の確認用
int power=1; // 乗数計算用
long check = 0; // long型 入力された値のチェック用
char word[NUMBER]; // 入力文字の保存用1
// 文字列の入力
printf("文字列を入力してください:");
scanf("%s",word);
// 入力された 文字数のカウント
for(i=0;word[num]!='\0';i++)
num++;
// INT_MAXの 文字数のカウント
while(int_max != 0) {
int_max /= 10;
max_num++;
}
// 一文字ずつ'char型'を'int型'にする
int kazu[num]; // 入力文字の保存用2
for(i=0;word[i]!='\0';i++) {
kazu[i] = str2value(word[i]);
// 変換された文字を確認する
// 1桁目の処理
if(i==0) {
// 負の値のとき1のフラグを立てる
if(kazu[i] == -3)
flag = 1;
// "+記号"のとき2のフラグを立てる
else if(kazu[i] == -5) {
flag = 2;
}
// 無効な値の場合 終了
else if(kazu[i] <= 0 || kazu[i] > 10) {
printf("無効な値が入力されました。終了します。\n");
return 0;
}
}
// 二桁目以降の処理
else
// 無効な値の場合 終了
if(kazu[i] < 0 || kazu[i] >= 10) {
printf("無効な値が入力されました。終了します。\n");
return 0;
}
}
// 記号なし数字の場合
if(flag == 0) {
// 桁数が多すぎるときは入力された文字列がINT_MAX以上とみなして終了させる
if(max_num < num) {
printf("INT_MAX以上の値が入力されました。終了します\n");
return 0;
}
// check に入力された文字列を数値にする
for(i=num;i>0;i--) {
check = check + (long)kazu[i-1]*power;
power *= 10;
}
}
// 記号あり数字の場合
else {
// 桁数が多すぎるときは入力された文字列がINT_MAX以上とみなして終了させる
if(max_num < num-1) {
printf("INT_MAXまたは、INT_MINを超える値が入力されました。終了します\n");
return 0;
}
// check に入力された文字列を数値にする 終了条件を(i>1)にすることで符号を無視
for(i=num;i>1;i--) {
check = check + (long)kazu[i-1]*power;
power *= 10;
}
}
// 負の値をチェック
if(flag == 1) {
// 負の値にする
check *= -1;
if(check < (long)INT_MIN) {
printf("INT_MINより小さい値が入力されました。終了します\n");
return 0;
}
}
// 正の値をチェック
else {
if(check > (long)INT_MAX) {
printf("INT_MAXより大きい値が入力されました。終了します\n");
return 0;
}
}
// 正しい値が入力された時
printf("文字列を数値に変換しました。\n");
printf("入力された値は:%ldです。\n", check);
return 0;
}
// str2value関数 (文字列を数値に変換して返す)
int str2value(const char mozi){
return mozi - '0';
}