2013年7月14日日曜日

開発環境

プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)の第3章(制御の流れ)3.6(ループ (do-while))の演習3-4を解いてみる。

その他参考書籍

演習 3-4.

intの最大の正の数は、(2^wordsize) - 1なので、問題のitoaプログラムでは最大の負の数、-(2^wordsize-1)をn = -nで正数に変換することは出来ない。最初に正か負だけを記憶しておき、計算中は三項演算子で絶対値を使って計算し、最後に記録しておいた正か負かにより-を付け加えるか判断するようにプログラムを修正。

コード

sample.c

#include <stdio.h>
#include <string.h>
#include <limits.h>
#define MAXLINE 1000000

void itoa(int n, char s[]);

int main()
{
    char s[MAXLINE];
    printf("%d\n", INT_MIN);
    itoa(INT_MIN, s);
    printf("%s\n", s);
    return 0;
}

void itoa(int n, char s[])
{
    int i, sign;
    void reverse(char s[]);
    
    sign = n;
    
    i = 0;
    do {
        s[i++] = (n < 0 ? -(n % 10): n % 10) + '0';
    } while ((n /= 10)  != 0);
    if (sign < 0) {
        s[i++] = '-';
    }
    s[i] = '\0';
    reverse(s);
}

void reverse(char s[])
{
    int c, i, j;
    
    for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
        c = s[i];
        s[i] = s[j];
        s[j] = c;
    }
}

入出力結果(Terminal)

$ ./a.out
-2147483648
-2147483648
$

0 コメント:

コメントを投稿