Shammer's Philosophy

My private adversaria

itoa 改良版-20110227

itoa 改良版-20110223 - Shammerismで言及していた負の数の処理とかをなるべく同じところにまとめたりしてみた。自分でできる範囲で可能な限りコードをスッキリさせたというところだろうか。

char * itoa(int x){
    char * value;
    // int max is 2147483647, this is 10 digit.
    int i, j, digit, result;
    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 ){
	    if( x < 0 ){
		i = i + 1; // for minus
		value = (char *)calloc((i + 1), sizeof(char));// 1 means '\0'
		value[0] = '-';
	    }
	    else {
		value = (char *)calloc((i + 1), sizeof(char));// 1 means '\0'
	    }
	    *(value + i) = '\0';
	    break;
	}
    }
    for( ; 0 <= i && *(value + 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;
    }
    return value;
}

もう不具合が出ませんように。