atoi関数を自作する
以前上記のような質問をしました。
さらに改良して、最後の問題に直面しました。
int strtoi(char *str, int *error){ int num = 0, ch = 0; *error = 0; while(isspace(*str)) str++; switch(*str){ case '+': ch = 1; break; case '-': ch = -1; break; } for(;*str; str++){ if(isdigit(*str)){ num = num * 10 +(*str - '0'); // 文字数字変換 if(num > INT_MAX){ num = INT_MAX; goto back_function; } } else{ if(num > 0){ *error = 2; goto back_function; } *error = 1; } } back_function: if(ch == -1) return num * ch; else return num; }
オーバーフロー対策です。
その他はとくに問題なく動作します。
最大値の方だけをまず考えます。
if(num > INT_MAX)
num = INT_MAX;
最初にこのように思いつきました。
しかし、実際にやってみると、
55555555555
your number : -279019293
となってしまいます。
なぜでしょうか??
numの値が変動するからかな・・・?と思ったのですが・・・
どのようにすれば、オーバーフローを防げますか??
他にはこのような技ですね。
if((num < INT_MIN / 10) || (num == INT_MIN / 10) && (*str - 0 > -1 * (INT_MINT % 10)))
少しの変化もありません・・・
どなたか教えてください。

回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。