Shammer's Philosophy

My private adversaria

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] をマイナスにしてしまえばよさそうかな。