itoa 改良版-20110223
itoa 改良版-20110217 - Shammerismの実装だと、10 の倍数だとうまくいかないことがわかった。その点を修正。
char * itoa(int x){ char * value; // int max is 2147483647, this is 10 digit. int i, j, digit, result; int length = -1; int rest = abs(x); // Check number of digit for( i = 10 ; 0 <= i ; i-- ){ digit = 1; for( j = i ; j != 0 ; j-- ){ digit = 10 * digit; } if( (rest / digit) != 0 ){ length = i; value = (char *)calloc((length + 1), sizeof(char));// 1 means '\0' break; } } for( ; 0 <= i ; i-- ){ // 1. calc the rightmost number // 2. fill in the step 1 result // 3. decrease the rest value digit result = rest % 10; switch (result) { case 0: *(value + i) = '0'; break; case 1: *(value + i) = '1'; break; case 2: *(value + i) = '2'; break; case 3: *(value + i) = '3'; break; case 4: *(value + i) = '4'; break; case 5: *(value + i) = '5'; break; case 6: *(value + i) = '6'; break; case 7: *(value + i) = '7'; break; case 8: *(value + i) = '8'; break; case 9: *(value + i) = '9'; break; default: // Do nothing break; } rest = (rest - result) / 10; } if( x < 0 ){ length = strlen(value); char temp[length]; for( i = 0 ; i < length ; i++ ){ temp[i] = value[i]; } temp[length] = '\0'; length = length + 1;// for minus free(value); value = (char *)calloc((length + 1), sizeof(char));//plus 1 is for '\0' value[0] = '-'; for( i = 0 ; i < length ; i++ ){ // + 1 is for '-' *(value + 1 + i) = temp[i]; } } value[length + 1] = '\0'; return value; }
これでもまだ負の数の時に二度値のコピーをしている。ここももっとスッキリさせることができそう。最初にマイナスかどうか確認して、value[0] をマイナスにしてしまえばよさそうかな。